Linux grep,egrep及相应的正则表达式用法详解

  linux在进行文本处理过程中的文本搜索工具称为正则表达式。文本搜索工具有grep、egrep、fgrep,egrep为正则表达式的扩展正则表达式,fgrep用于搜索文本字符串,与 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。grep的含义为: global search Regular expression and Print out the line

      正则表达式(REGular EXPression REGEXP)是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配功能,根据用户指定的文本模式(正则表达元字符以及正常字符组合而成)对目标文件进行逐行搜索,显示能匹配到的行。

   首先讲述的是正则表达式grep指令的用法以及一些常用的选项的应用以及简单的示例:            

  grep [OPTIONS] PATTERN [FILE...]  

     --color=auto  自动显示  }

                        always 有时  } 对匹配到内容是否自动显示为红色

                            never   从不显示      }

           -o:只显示被匹配到的内容

           -iignore case ,所有的不区分字符大小写

          -v: 显示不能够被模式匹配到的行

           -E :使用扩展的正则表达式

           -A # : 被模式所匹配的行以及后面#

           -B#:被模式所匹配的行以及前面#行 

           -C#:被模式所匹配的行以及前后#

示例1:显示匹配到的字符红色

[root@localhost ~]# grep --color=auto "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

示例2:只显示匹配到的内容
[root@localhost ~]# grep -o --color=auto "root" /etc/passwd
root
root
root
root

 下面讲的是基本正则表达式的元字符:

 字符匹配:
     . :匹配单个字符
     []:匹配指定范围内的任意单个字符  
         例: [root@localhost ~]# grep "[Cc]a" /etc/rc.d/rc.sysinit      
         匹配出现Ca或ca,a不作为结尾,C/c不作为开头,匹配Ca或者ca在文本中每行的任意位置。
   
    [^] :匹配指定范围外的任意单个字符
    [0-9]、[[:digit:]]表示0-9中的任意的单个数字
    [^0-9]、[^[:digit:]]表示0-9范围外的任意单个字符
    [a-z]、[[:lower:]]表示a-z中任意一个小写字母
    [A-Z]、[[:upper:]]表示A-Z中任意一个大写字母
    [[:space:]]表示一个空格符
    [[:punct:]]表示任意一个标点符号
    [0-9a-zA-Z]、[[:alnum:]]表示任意一个数字或字母
    [a-zA-Z]、[[:alpha:]]表示任意一个大写字母或小写字母  
 
  次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配前面字符指定的次数。
    * :任意次数  
例:"ab*c"   ab……bc匹配任意个b                                      abbc ,ac  可以匹配到                                                      abb, 不能匹配到                        .* : 任意长度的任意字符  (贪婪模式,会仅可能的去匹配)
   例     
   [root@localhost ~]# grep "r.*t" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

   \? :0次或1次 ,表示其左侧字符可有可无                                                        " ab \?c "                                                                     abc ,ac 可以                                                         abbc  不可以

    \+ : 1次或多次,表示其左侧字符至少出现1次;
          " ab \+c "                                                                         ac ,不可以                                                                       abc,abbbbc 可以
                                       \{m\} :m次,表示其左侧字符精确出现m次;                                \{m,n\}:表示其左侧字符至少出现m次,至多出现n次;                                                           "ab\{2\}c" 匹配2次 -> abbc                      
          \{0,n\} : 至多n次  "ab\{0,3\}c" 0~3次 -> ab、 abbc 、abbbc                                   \{m,\} : 至少m次      
          "ab\{1,\}c" -> ab、 abbc 、abbbc 、 ab…bc

              位置锚定:

                          ^ :锚定行首,^ PATTERN                    

                          $:锚定行尾,PATTERN$

                          ^PATTERN$ :用模式来匹配整行内容

                          ^$ :匹配空白行;

           例:用于匹配整行内容

         [root@localhost ~]# grep "^sh.*sh$" /etc/passwd

         sharang:x:5002:5002::home/sharang:/bin/tcsh

              

      单词锚定: 由非特殊字符组成的连续的字符串                                                 

                                

          锚定单词词首:  \< PATTERN\b                                                                                                                                                                                   [root@localhost tmp]# grep "\<sh" /etc/passwd 

                          shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


                      锚定词尾: PATTERN\>PATTERN \b

                            \<PATTERN\>:匹配到PATTERN能匹配到整个单词                                  

           例:匹配两位数字

          [root@localhost ~]# ifconfig | grep "\<[0-9]\{2\}\>"

           eth0      Link encap:Ethernet  HWaddr 00:0C:29:5A:B6:F5  

                     inet addr:192.168.191.16  Bcast:192.168.191.255  Mask:255.255.255.0

                     inet6 addr: fe80::20c:29ff:fe5a:b6f5/64 Scope:Link

           

                   分组:\(\)

                            注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符可以被grep记忆 (保存于内置的变量                 中,这些变量是 \1 , \2 ,…) 因此,还可以被引用       

                               \1 : 引用,模式自左而右,由第一次左括号以及与之对应的右括号中的模式所匹配到的内容

                               \2 :引用 ,模式中自左而右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容;

                                           \(ab\(cd\)\) \1 \2    \1匹配到ab  \2匹配到cd                   

             (1) He like his lover. 
             (2) He like his liker. 
             (3) She love her lover. 
             (4) She love her liker.

              "\(l..e\).*\1"  可以匹配上面内容



下面说下扩展的正则表达式egrep,也是通过搜索匹配表达式的模式,不过于grep的区别就是不需要添加转义符\ ,字符匹配、次数匹配、位置锚定、分组的用法是相同的。

     字符匹配: .:匹配单个字符 

                []:匹配任意单个字符

               [^]:匹配范围外的任意单个字符

     次数匹配:

                *:任意次         

             ?:0次或1次

             + :至少1次

            {m}:精确匹配m次  

          {m,n}: 至少m次,至多n次

          {m,}:至少m次

         {0,n}:至多n次

     位置锚定:

              ^: 锚定行首

             $ : 锚定行尾

         \<、\b:锚定词首

          \>、\:锚定词尾

         分组:    

           ():  引用为: \1,\2...

        或者:

              a|b :a或b,或者两侧的所有内容;

              例:匹配meminfo中S或s开头的行

              # egrep "^(S|s)" /proc/meminfo


最后的fgrep命是用来查找一个或多个与给出的字符串或词组相匹配文件中的行。fgrep 查询速度比grep命令快,但是不够灵活:它只能找固定的文本,而不是规则表达式。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。