grep与egrep命令及正则表达式

时间:2021-09-22 08:55:18

在Linux中,有很多文本处理的方式,今天我们就来介绍其中的一种grep系。

grep系相对来说也是功能很强大的文本处理工具,俗称文本三剑客之一(其余两个为sed、awk)。

grep系可分为grep、egrep、fgrep(默认情况下不开启正则表达式)。

grep系的功能:利用正则表达式全局搜索,并将匹配的都显示出来

grep的用法格式:  grep [options] PATTERN [FILE...]                           

            其中PATTERN为要匹配的字符

        先举个简单例子:[root@localhost ~]# grep -c root /etc/passwd

            运行时就会在/etc/passwd目录下找出含有root的文件

            其中root就是PATTERN

下面我们就重点来谈谈正则表达式。

正则表达式:

           元字符:会被正则表达式引擎解释为特殊含义;                               

    基本的正则表达式:BRE(grep默认使用)

    扩展的正则表达式:ERE(egrep默认使用)

 其中:   

    grep默认仅支持基本正则表达式;

    egrep默认仅支持扩展正则表达式;

    fgrep默认不开启正则表达式引擎;

            文本字符:只具备字符表面含义的那些字符

grep系的选项有很多,下面列举一些比较常用的选项:

              -i, --ignore-case

              忽略模式 PATTERN 和输入文件中的大小写的分别。

              

              -v, --invert-match

              改变匹配的意义,只选择不匹配的行。反向匹配


              -c, --count

              禁止通常的输出;作为替代,为每一个输入文件打印一个匹配的行的总数。

               

              -o, --only-matching

              只显示匹配的行中与 PATTERN 相匹配的部分。关闭贪婪模式。


              -q, --quiet, --silent

              安静。不向标准输出写任何东西。如果找到任何匹配的内容就立即以状态值

              0 退出,即使检测到了错误。 参见 -s 或 --no-messages 选项。


              --colour[=WHEN], --color[=WHEN]

              在匹配的行周围以  GREP_COLOR  环境变量中指定的记号来标记。WHEN

              可以是 `never', `always', 或是 `auto'。


              -E, --extended-regexp(相当于egrep)

              将模式 PATTERN 作为一个扩展的正则表达式来解释 (参见下面)。

              -F, --fixed-strings(相当于fgrep)

              将模式 PATTERN  视为一个固定的字符串的列表,用新行  (newlines)

              分隔,只要匹配其中之一即可。

              -G, --basic-regexp(相当于grep)

              将模式  PATTERN  作为一个基本的正则表达式     (参见下面)

              来解释。这是默认值。


              -P, --perl-regexp

              将模式 PATTERN 作为一个 Perl 正则表达式来解释。

  

              -A NUM, --after-context=NUM

              打印出紧随匹配的行之后的下文NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。                               

              

              -B NUM, --before-context=NUM

              打印出匹配的行之前的上文NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。                                  

              

              -C NUM, --context=NUM

              打印出匹配的行的上下文前后各NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。                              

              

PATTERN:正则表达式字符:

   基本的正则表达式字符:

     globbing(简化版的正则表达式)


     字符匹配:

         .:匹配任意单个字符

         所有的字符集都可以放到中括号中表示单个字符

         []:匹配指定位置的单个字符

         [^]:匹配指定位置以外的单个字符       

         [:xdigit:]:所有的十六进制

         a-z:所有的小写字母

         A-Z:所有的大写字母

         0-9:所有的十进制数字


         次数匹配:表示该类字符之前的那个字符可以出现任意次

         *:其前面的字符可以出现零壹或多次(使用较多)

         \?:其前面的字符可有可无

         \+:其前面的字符至少出现一次

         \{m\}:其前面的字符必须出现m次

         \{m,n\}:其前面的字符至少出现m次,至多出现n次

         \{,n\}:其前面的字符至多出现n次

          \{m,\}:其前面的字符至少出现m次


  .*:任意长度的任意字符


位置锚定字符:

             行锚定:

 行首锚定:^

 行尾锚定:$

     字锚定:

 字首锚定:\< 或 (\b老方法,一般不用了)

 字尾锚定:\> 或 \b


注意:对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串;



    分组与引用字符:

        \(PATTERN\):PATTERN当作整体字串来处理,不分开          

            例:\(yxz\):其中把yxz当作一个整体来进行搜素

        在正则表达式引擎中,有一系列的内置变量,这些变量会保存至所有分组内的字符信息。用于后向引用,这些变量依次是:\1, \2, \3, 

         \1:第一组小括号中的PATTERN匹配到的字符

         \2:第2组小括号中的PATTERN匹配到的字符


例:找uid与gid相同的用户

    [root@localhost ~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd

    用户名与bash相同

    [root@localhost ~]# grep '\(\<[[:alpha:]]\+\>\).*\1$' /etc/passwd


        或:\|(多选一)

          注意:\|将其左右两边的字符串当作整体对待;

        例子:                                                                                          [root@localhost ~]# grep -c '^[[:space:]]*$' 2

      ifconfig | grep '\<1[0-9][0-9]\>'

      ifconfig | grep '\<255\>$'


    

    grep [options] [-e PATTERN | -f FILE] [FILE...]  [FILE...]   (例:/etc/* )


       默认情况下,grep只有一个PATTERN,如果想要写多个PATTERN的话,要使用-e 选项

       将所需要的PATTERN写入到一个文件中,保证每行只有一个PATTERN,此时我们可以使用-f file方式



egrep:默认仅支持扩展正则表达式

grep [options] PATTERN [FILE...]

扩展的正则表达式元字符与grep差不多

   但其“或”符号为: |


fgrep:PATTERN所有的字符都被当作文本字符来处理


本文出自 “春夏秋冬” 博客,请务必保留此出处http://liangqunzhi.blog.51cto.com/10674929/1915681