shell-grep中的正则表达式

来源:互联网 发布:淘宝主图视频手机拍摄 编辑:程序博客网 时间:2024/06/05 03:26

介绍

ls /usr/bin | grep zip

这个命令会列出,位于目录 /usr/bin 中,文件名中包含子字符串“zip”的所有文件。

这个 grep 程序以这样的方式来接受选项和参数:

grep [options] regex [file...]

这里的 regx 是指一个正则表达式。
下面是grep的常见options列表:

-i:模式匹配时忽略大小写-V:显示不匹配的行-l:列出匹配模式的文件名称,而不是打印匹配的行-n:列出检索目标所在的行号-c:统计匹配的行总数,不显示行信息

grep 正则表达式示例

在 /etc/passswd 目录中搜索 ‘liuyan’:

grep liuyan /etc/passwd

输出:

liuyan:x:1001:1001:,,,:/home/liuyan:/bin/bash

搜索大小写任意的 liuyan 或 raj:

grep -E -i -w 'liuyan|raj'/etc/passwd

这里加上-E,就是一个扩展的正则表达式的模式。

锚点

你可以分别使用 ^ 和 $ 符号来正则匹配输入行的开始或结尾。

grep ^liuyan /etc/passwd

仅仅只搜索出以单词 liuyan 开始的行,即不显示 liuyangit、liuyang 等:

grep -w ^liuyan /etc/passwd
grep 'foo$' 文件名        #找出以单词foo结尾的行grep '^foo$' 文件名       #匹配仅仅只包含foo的行grep '^$' 文件名          #搜索空行

字符类

grep '[lL]iuyan' 文件名grep -w '[lL]iuyan[0-9]' 文件名grep 'foo[0-9][0-9]' 文件名grep '[A-Za-z]' 文件名grep [wn] 文件名

放在括号内的表达式,即包在 “[[:” 和 “:]]” 之间的字符类的名字,它表示的是属于此类的所有字符列表。标准的字符类名称如下:

[[:alnum:]] - 字母数字字符[[:alpha:]] - 字母字符[[:blank:]] - 空字符: 空格键符 和 制表符[[:digit:]] - 数字: '0 1 2 3 4 5 6 7 8 9'[[:lower:]] - 小写字母: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'[[:space:]] - 空格字符: 制表符、换行符、垂直制表符、换页符、回车符和空格键符[[:upper:]] - 大写字母: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
grep '[[:upper:]]' 文件名  #匹配所有大写字母

通配符

你可以使用 “.” 来匹配单个字符。

grep '\<b.t\>' 文件名  #匹配以 "b" 开头以 "t" 结尾的3个字符的单词grep '^..$' 文件名        #匹配只有两个字符的所有行grep '^\.[0-9]' 文件名 #匹配以一个点和一个数字开头的行
\< 匹配单词前面的空字符串\> 匹配单词后面的空字符串
egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' 文件名  #匹配通用的IP地址
grep -e '--test--'文件名           #搜索以“-” 符号开头的匹配模式,如果不用-e选项grep 命令会试图把 '--test--' 当作自己的选项参数来解析grep -E 'word1|word2'文件名        #使用 grep 的“或”匹配grep 'word1' 文件名 | grep 'word2' #使用 grep 的“和”匹配

序列检测

egrep "v{2}" 文件名        #匹配字符 “v" 出现两次egrep 'co{1,2}l' 文件名    #匹配 "col" 和 "cool"egrep 'c{3,}'文件名        #匹配至少有三个 'c' 字符的所有行grep "[[:digit:]]\{2\}[-]\?[[:digit:]]\{10\}" 文件名   #匹配 91-1234567890(二个数字-十个数字) 这种格式

总结

字符限定符

.           匹配任意的一个字符-[]中表示字符范围[]          代表一定有一个在括号内的字符(非任意字符)[^]         若括号内的第一个字符为指数字符(^),那表示反向选择

数量限定符

?       匹配前面的子表达式,0-1次。*       匹配前面的子表达式,0-N次。+       匹配前面的子表达式,1-N次。{N}     匹配前面的子表达式 N 次。{N,}    匹配前面的子表达式 N 次到多次。{N,M}   匹配前面的子表达式 N 到 M 次。

位置限定符

^       匹配行首位置。$       匹配行尾位置。\b      匹配一个单词前后的空字符串。\B      匹配一个单词中间的空字符串。\<      匹配单词前面的空字符串。\>      匹配单词后面的空字符串。
egrep -c '[[:punct:]]{2,}' -r ./raw_data    #查找超过两个标点在一起的行数egrep -c '\.{2,}' -r ./raw_data             #查找超过两个.在一起,有多少行grep -o 'n.t' nohup.out |wc -l              #个数grep -o ‘objStr1\|objStr2'  filename|wc -l  #直接用\| 链接起来即可
原创粉丝点击