Linux系统上文本处理工具有三大剑客;

    第一剑:Grep、Egrep、Fgrep。是文本搜索工具,基于“pattern”对给定的文本进行精确的搜索操作!

    第二剑:Sed。全称Strema Editor,是一种文本编辑工具!

    第三剑:Awk。文本格式化工具,文本报告生成器!

    本文主要描述三剑客中的第一剑:“大宝剑”!

   

    Linux系统中的grep、egrep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,对目标文本逐行进行匹配检查;打印出符合条件的行。下面将详细的说明grep及相应的正则表达式和用法

     

    Grep家族:

     Grep:Global search REgular expression and Print out the line. 支持使用基本正则表达式;

     Egrep:支持使用扩展正则表达式;

     Fgrep:不支持使用正则表达式;

 

   正则表达式:Regular Expression, 简称:REGEX或REGEXP

     由一类特殊字符及文本字符所编写的模式,其有些字符不表示其字面意义,而是用于表示控制或通配的功能;正则表达式有基本正则表达式(BRE)、扩展正则表达式(ERE)两类。


   一、Grep命令基本常用选项及正则表达式用法!

    1、Grep常用选项;

     (1)、“-i”:忽略字符的大小写;

       例:

            

       如上图所示,字符“a”、“A”都显示出来了。

     

     (2)、“-o”:仅显示匹配到的文本自身;

       例:

          

        如上图所示,只显示出来了“a”、“A”字符。并没有像上图一样把整行显示出来。


     (3)、“-v”:反向匹配;

      例:

        图一:

           

       图二:     

           

       由图一中命令及信息可知,每行结尾都是以“bash”结尾的;

       图二中的命令加了选项“-v”,每行中的最后一个单词都不以“bash”结尾了。


     (4)、“-E”:支持扩展的正则表达式,可以精确匹配字符(命令“grep -E”实际上就是命令“egrep”,后面我们将会描述到);

     例: 

          

      由图可知,文本中所有的“bash”都已红色的颜色显示出来!

  

     (5)、“-q”:静默模式,不输出任何信息;

     例:

         

       由上图信息显示,在正确的命令下并没有显示出任何信息。我们可以输入“echo $?”来显示命令是否正确执行。如果显示的为“0”则表示正确执行。如果显示为“1-127”则不正确!


    

    2、Grep基本正则表达式之字符匹配

     (1)、“.”:匹配任意单个字符;

      例:

           

       此命令是在单词“bsah”后面匹配任意2个单个字符;命令中有几个“.”就匹配多少个单字个符!

     (2)、“[]”:匹配范围内的任意单个字符;

      例:

         

        由上图信息可得,只要是字符“a”、“b”、“c”都会以红色的颜色显示出来!

     

     (3)、“[^]”:匹配范围外的任意单个字符;

      例:

            

        由图中命令所知,只显示“a”以及特殊字符。“b-z”、“0-9”、“A-Z”的字符都不会显示!


     (4)、[[:upper:]]:所有的大写字母;

      例:

         

     (5)、[[:lower:]]:所有的小写字母;

      例:

         

     (6)、[[:digit:]]:所有的数字;

      例:   

          

     (7)、[[:alnum:]]:所有的数字和字母;

      例:

         

     (8)、[[:space:]]:所有的空白字符;

      例:

          

       注意:空白字符并不会显示以特殊颜色显示出来,但是用鼠标拉过去背景颜色会变红!由例(9)中的图可知,命令中未要求要显示空白字符,所以鼠标拉过去背景颜色是黑色的!

     (9)、[[:punct:]]:所有的标点符号;

      例:

         

     

    3、Grep基本正则表达式之匹配次数;

     (1)、“*”:匹配前面的字符任意次(0次、1次、或多次)

      例: 

         

      图中的命令表示只匹配前面的“x”任意次;即“x”可以有一次或多次,也可以没有!


     (2)、“.*”:匹配任意长度的任意字符;

      例:

        

       

     (3)、“\+”:匹配前面的字符至少1次

        


     (4)、“\?”:匹配前面的0次或1次,即前面的字符可有可无;

      例:

        


     (5)、“\{m\}”:其前面的字符出现m次,m为非负整数;

      例:

        


     (6)、“\{m,n\}”:其前面的字符至少出现m次,至多出现n次。m、n为非负整数;[m,n]

      例:

      图一:   

        

      图二 : 

        

      图一命令表示“x”至少出现0次,至多出现1次;

      图二命令表示“x”至少出现一次;

     

    4、Grep基本正则表达式之位置锚定;

     (1)、“^”:行首锚定;用于模式的最左侧,^PATTERN;

      例:

        

  

     (2)、“$”:行尾锚定;用于模式的最右侧,PATTERN$;

      例:

        

    

     (3)、“^PATTERN$”:要让PATTERN完全匹配一整行;

      例:

        

    

      (4)、“^$”:显示空行;

       例:

          

      (5)、“^[[:space:]]*$”:显示任意个空白字符的行;

       例:

         

  

      

      (6)、“\<或\b”:词首锚定,用于单词模式的左侧,格式为\

       例:

          

   

      (7)、“\>或\b”:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b;

       例:

          


     (8)、“\”:单词锚定;

      例:

         

     

     (9)、“\(PATTERN\)\1”:后向引用,引用前面的括号中的模式所匹配到的字符串;

      例:

         



    二、Egrep命令扩展正则表达式用法!

     1、Egrep扩展正则表达式之字符匹配;

     (1)、“.”:匹配任意单个字符;

      例:

        


     (2)、“[ ]”:范围内的任意单个字符;

       例:

         


   

     (3)、“[^ ]”:范围外的任意单个字符;

       例:

          

  

     

    2、Egrep扩展正则表达式之匹配次数;

     (1)、“*”:匹配前面的字符任意次;

       例:

          


     (2)、“?”:匹配前面的字符0次或1次;

      例:

        

 

     (3)、“+”:匹配前面的字符1次或多次;

      例:

         

 

     (4)、“{m}”:匹配前面的字符m次;

      例: 

         

 

     (5)、“{m,n}”:匹配前面的字符至少m次,至多n次;

      例:

         


    3、Egrep扩展正则表达式之锚定位置;

    (1)、“^”:行首锚定,用于模式的最左侧,^PATTERN;

     例:

        

    (2)、“$”:行尾锚定,用于模式的最右侧,PATTERN$;

     例:

         

 

    (3)、“\<或\b”:词首锚定,用于单词模式的左侧,格式为\

     例:

         

    (4)、“\>或\b”:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b;

     例:

         

    (5)、“\”:单词锚定;

     例:

      


    4、Egrep扩展正则表达式之分组及引用;

     (1)、“(pattern)”:分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;

      例:

          

     

     (2)、“(pattern)\1”后向引用:引用前面的括号中的模式所匹配到的字符串;