grep是一个文本检索工具,号称linux文本处理三大剑客之一,通常会结合正则表达式使用,支持基本正则表达式和扩展的正则表达式,功能很强大,给我们搜索文本带来了很大的便利,默认情况下,它是贪婪模式,能匹配多长就匹配多长,会将匹配到的整行显示出来。另外两大剑客:sed、awk。
grep常用选项:
grep -i:忽略大小写
[root@localhost ~]# grep -i tom /etc/passwd
tom:x:506:506::/home/tom:/bin/bash
Tom:x:507:507::/home/Tom:/bin/bash
grep -o:仅显示匹配到的文本
[root@localhost ~]# grep -o root /etc/passwd
root
root
grep --color:对匹配到的文本进行高亮显示
[root@localhost ~]# grep --color=auto tom /etc/passwd
tom:x:506:506::/home/tom:/bin/bash
grep -v:显示匹配文本以外的文本
[root@localhost ~]# grep -v tom /etc/passwd |tail -2
named:x:25:25:Named:/var/named:/sbin/nologin
Tom:x:507:507::/home/Tom:/bin/bash
grep -e:表示逻辑关系“或”
[root@localhost ~]# grep -e tom -e Tom /etc/passwd
tom:x:506:506::/home/tom:/bin/bash
Tom:x:507:507::/home/Tom:/bin/bash
grep -q:静默模式,无论匹配到还是没有匹配到文本都不显示
[root@localhost ~]# grep -q tom /etc/passwd
[root@localhost ~]#
grep -A #:显示模式匹配到的文本,并显示后#行
[root@localhost ~]# grep -A 1 named /etc/passwd
named:x:25:25:Named:/var/named:/sbin/nologin
tom:x:506:506::/home/tom:/bin/bash
grep -B #:显示模式匹配到的文本,并显示前#行
[root@localhost ~]# grep -B 1 named /etc/passwd
mage:x:505:505::/home/mage:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin
grep -C #:显示模式匹配到的文本,并显示前后各#行
[root@localhost ~]# grep -C 1 named /etc/passwd
mage:x:505:505::/home/mage:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin
tom:x:506:506::/home/tom:/bin/bash
grep -E:支持扩展的正则表达式
grep基于模式匹配,默认支持基本的正则表达式,可用-E选项支持扩展的正则表达式,相当于egrep。
正则表达式有很多元字符组成,有基本的正则表达式BRE和扩展的正则表达式ERE。
基本的正则表达式元字符:BRE
字符匹配:
.:匹配任意单个字符
【】:匹配范围内任意单个字符
【^】:匹配范围外任意单个字符tt
【:digit:】:::所有数字 【:alnum:】:所有数字和字母
【:lower:】:所有小写字母 【:space:】:空白字符
【:punct:】:所有标点符号 【:alpha:】:所有字母
【:upper:】:所有大写字母
[root@localhost ~]# grep T.m /etc/passwd
Tom:x:507:507::/home/Tom:/bin/bash
[root@localhost ~]# grep [Tt] /etc/passwd |tail -2
tom:x:506:506::/home/tom:/bin/bash
Tom:x:507:507::/home/Tom:/bin/bash
次数匹配:
*:匹配前面字符任意次
.*:匹配任意长度任意字符
\+:匹配前面字符至少一次
\?:匹配前面字符0次或1次
\{m\}:匹配前面字符m次
\{m,n\}:匹配前面字符至少m次,至多n次
\{m,\}:匹配前面字符至少m次
\{,n\}:匹配前面字符至多n次
[root@localhost ~]# grep "x*y" hadop
xxy
xy
yy 匹配前面的x任意次,0次也匹配
[root@localhost ~]# grep "x\+y" hadop
xxy
xy 匹配前面的x至少一次
[root@localhost ~]# grep "x\{2\}y" hadop
xxy 匹配前面的x两次,精确匹配
位置锚定:
^:行首锚定
$:行尾锚定
^$:空行
^PATTERN$:用于模式匹配整行
^*$:非空白行
\<或\b:词首锚定
\>或\b:词尾锚定
\<PATTERN\>:锚定整个单词
[root@localhost ~]# grep "^root" --color=auto /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep "/sbin/nologin$" /etc/passwd |head -2
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
分组:
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,分组匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量命名为:\1,\2,\3....可以进行后向引用,引用前面分组中模式所匹配到的字符
\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符.
\(string1\+\(string2\)*\)
\1:string1\+\(string2\)*
\2:string2
[root@localhost ~]# grep "\(r..t\).*\1" --color=auto /etc/passwd
root:x:0:0:root:/root:/bin/bash
前面匹配到root,记录在变量\1中,在进行后面引用,在本行中,在有root出现才会被模式匹配
[root@localhost ~]# grep "\(r..t\)" --color=auto /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
如果只进行分组,不进行后向引用,结果就成这样,只要被分组匹配到都会显示出来
扩展正则表达式元字符:ERE
扩展正则表达式元字符和基本正则表达式相比,更简洁,字符匹配、位置锚定,元字符都一样。只有次数匹配和分组元字符稍有偏差。
次数匹配:
*:匹配前面字符任意次
.*{}:匹配任意长度任意字符
+:匹配前面字符至少一次
?:匹配前面字符0次或1次
{m}:匹配前面字符m次
{m,n}:匹配前面字符至少m次,至多n次
{,n}:匹配前面字符至多n次
{m,}:匹配前面字符至少m次
分组:()