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次

    分组:()