grep、sed、awk结合正则表达式运用起来会很高效,在工作中遇到这种问题的解决方案以及用在shell编程中也是很重要的~所以值得去花时间好好总结一下。
1. 基本的元字符集
-------------------------------------------------------------------------------------------------------------------------
^ 只匹配行首
$ 只匹配行尾
* 一个单字符后紧跟*,匹配0个或多个此单字
[ ] 匹配[ ]内字符。可以是一个单字符,也可以
表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]
\ 用来屏蔽一个元字符的特殊含义。因为有时
特殊含义。\可以使其失去应有意义
. 匹配任意单字符
p a t t e r n \ { n \ } 用来匹配前面p a t t e r n出现次数。n为次数
p a t t e r n \ { n,\ } 含义同上,但次数最少为n
p a t t e r n \ { n,m \ } 含义同上,但p a t t e r n出现次数在n与m之间
--------------------------------------------------------------------------------------------------------------------------
具体含义:
^: 在一行的开始匹配字符或单词
如要显示当前目录下的目录文件:ls –l | grep ‘^d’
但是,如此结合了括号“[]”的话,它就变成另一种含义了,表示非,否定。
比如,显示当前目录下不是目录的文件:ls –l | grep ‘^[^d]’
$:这个和上面的”^”是相反的,它从行尾匹配字符串或字符,$符号放在匹配符后面
如,返回以“.lib”结尾的文件可以这样表示:.lib$
$和^相结合使用可以表示空行:^$,中间不包含任何字符
*:这个应该不用多说,用得最多,在搜索中常用来模糊匹配,表示任意一个或者一连串
[]: 使用[ ]匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开(这个逗号是可选的),使用“-”表示一个字符串范围,表明字符串范围从“-”左边字符开始,到“-”右边字符结束。
如表示任意数字:[0123456789]或者[0-9],任意字母:[a-zA-Z]
在字符序列结合使用中,可以用[ ]指出字符范围,比如要匹配一个单词以n开头s结尾,可以这样表示:n[a-zA-Z]s
\: 转义符,对于要那些特殊字符失去其含义而只表示一个字符的话只需要在其前面加上“\”符,如表示一个$符:\$
.: “.”号匹配单个字符,注意,“.”允许匹配A S C I I集中任意字符,或为字母,或为数字。如表示以a开头但是中间有两个字符且以z结尾的字符串可以这样:a..z
pattern\ {n\},pattern\{n,\},pattern\{n,m\}:上面已经提的够明了了,再说明一下:
第一个表示pattern出现的次数为n,第二个表示pattern出现的次数至少为n,第三个表示pattern出现的次数为n至m之间,n,m为0-255间的任意整数。如表示日期的格式可以这样(这里以dd-mm-yyyy表示):[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}
2. grep的使用
格式:grep [选项] 基本正则表达式 [文件或者字符串]
常用grep选项:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
3. grep结合正则表达式
[]:grep ‘c[aD]’datafile,显示c开头,a或者D结尾的行
^:显示当前目录下不是目录的文件:ls –l | grep ‘^[^d]’
.: grep ‘tes..ak’datafile tes和ak之间有任意两个字符的行
Pattern出现的概率:grep ‘T\{2,\}’ datafile,字符T至少出现两次的行
$^:grep –n ‘^$’datafile 查询空行并显示其所在行数.
4. grep –E
grep命令加- E参数,这一扩展允许使用扩展模式匹配,如表示含north或者west的行:
grep –E ‘north|west’ datafile
5. egrep
egrep代表expression或extendedgrep,它接受所有的正则表达式,egrep的一个显著特性是可以以一个文件作为保存的字符串,然后将之传给egrep作为参数,要使用“-f”选项,将匹配的正则表达式写入到文件regu.rule中,再通过-f参数指定文件名即可:egrep –f regu.rule datafile