一、正则表达式介绍:  

        所谓正则,又称正则表达式、正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。


        给定一个正则表达式和另一个字符串,我们可以达到如下的目的:


           1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);

           2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。


        正则表达式的特点是:


             1. 灵活性、逻辑性和功能性非常的强;

             2. 可以迅速地用极简单的方式达到字符串的复杂控制。

 

        正则表达式的字符串表示方式按照严谨度的不同,分为基础正则表达式和扩展正则表达式。为了能够进一步了解正则表达式在文本处理中的应用,下面我们利用grep命令和egrep命令进行探讨。


    grep命令:


    grep [OPTIONS] PATTERN [FILE...]


            --color : color有三个值供选择:never、always、auto。always和auto的区别就是,always会在任何情况下都给匹配字段加上颜色标记,当通过管道或重定向时就会多出一些控制字符;而auto则只在输出到终端时才加上颜色。

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

        -i:搜索时不区分字符大小写;

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

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

        -A # :显示匹配到的内容后面多少行

        -B # : 显示匹配到的内容前面多少行

        -C # : 显示匹配到的内容前后多少行


Grep常用选项介绍:

      --color:让匹配到的字符用颜色显示出来;

        检索/etc/passwd文件中包含root字符的文件,然后用颜色显示匹配到的字符

          wKioL1UbYC3xNshNAAA-2FFksIQ627.jpg

       给grep命令做了命令别名,这样以后就不用每次加上--color参数了;

         wKiom1UbXvDSz4QDAABjuoAuUHo910.jpg


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

        检索/etc/passwd 里面是否有centos用户,如果加上-o 选项,只显示匹配到的行;

        wKiom1UbYByzmparAABiRxv9PqM057.jpg


    -i:搜索时不区分字符大小写;

        检索/etc/fstab中包含"uuid"的小写字符串,最后找的的结果都是大写字符的行,不区分大小写

        wKioL1UbY2GSWE3qAABXq6l_3hI572.jpg


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

           检索/etc/init.d 所有包含#号的行;加上-v后,就是取反,只显示不包括#号的行;

    

        wKiom1UbY0DAOszeAAEc2HFjeFQ738.jpg

        wKioL1UbZH_y_aHbAAAzH-k-XL4069.jpg

 

    -A # :显示匹配到的内容后面多少行,#号可以是任意数字;

        检索/etc/inittab 带0的行,加上"-A 2"后就多显示了后面的2行的内容;


         wKiom1UbZQLxyU-hAADStXBmWO8187.jpg


    -B # : 显示匹配到的内容前面多少行

        检索/etc/inittab 带0的行,加上"-B 2"后就多显示前面的2行的内容;


        wKioL1UbZyTwEmkHAACr0KN-v7k928.jpg


    -C # : 显示匹配到的内容前后多少行

        检索/etc/inittab 带0的行,加上"-B 2"后就多显示前面和后面各2行的内容;


        wKiom1UbZnXhMGOBAAD4_CiX3EQ308.jpg

    

    -E:使用扩展的正则表达式,表示方法 egrep 或者 grep -E ;


基本正则表达式元字符:

    字符匹配:

    . :匹配任意单个字符

              检索/etc/passwd 包含r..t的字符,  .  可以匹配任意单个字符; 这里的..匹配2个任意字符;

            wKioL1UbaR_BcElzAAA-GnIj85s563.jpg

    [ ]:匹配指定范围内的任意单个字符

              检索/etc/rc.d/rc.sysinit 中包含N或小n的字符后面跟了任意2个字符的字符串;用-o只显示匹配到的字符串

              wKiom1UbakLi-OWPAABPnX439WQ862.jpg


        [[:digit:]]:匹配任意一个数字;[0-9]

        [[:lower:]]:匹配任意一个小写字母;[a-z]

        [[:upper:]]:匹配任意一个大写字母;[A-Z] 

        [[:space:]]:匹配任意一个空白字符,制表符,空格和tab键;

        [[:punct:]]:匹配任意一个标点符号;

        [[:alnum:]]:匹配任意一个字母或数字;[0-9a-zA-Z]

        [[:alpha:]]:匹配任意一个字母;[a-zA-Z]


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


次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数;工作于贪婪模式

 

        *:匹配其前一个字符的任意长度,表示0次、1次或多次;处于贪婪模式,有多少个都显示出来;

          

                wKioL1UbdK_i4GjsAAA4SLwHeQo470.jpg


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

              只要包含ab开头的行都显示出来;

                wKiom1Ubc-DAm-CdAAA5rjwrJWs836.jpg


        \?:0次或1次;表示其左侧字符可有可无;

                wKioL1UbdeyDKwn6AAA1ArkxNGk668.jpg

        \+ : 1次或多次,前左边这个字符至少出现一次;


                wKioL1UbdjKDUT_rAAA4YDGUxl0038.jpg

        \{m\}:精确匹配m次,表示其左侧字符精确出现m次;


                wKioL1Ubdm3AANhcAAA1X_M1Pas923.jpg


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

                wKioL1UbdprB25uKAAA6N6wRITQ407.jpg

         \{0,n\}:至多n次

                wKiom1UbeJ2y_lCaAAA5QdnWBZo401.jpg

          \{m,\} : 至少m次

                wKioL1UbegaidsdHAAA4-7PCnAM456.jpg

       



位置锚定:

    ^:锚定行首

    $:锚定行尾

    ^$ :匹配空白行;   

     ^:锚定行首

        检索/etc/passwd 匹配不是r开头后面跟了任意3个字符的字符串;


        wKiom1UbcYPRnh1uAAC5UqzmscY573.jpg


     $:锚定行尾

        检索/etc/passwd 行尾是bash的字段;


        wKioL1Ubep6A9YrHAAD7ipMhiH8375.jpg


     ^$ :匹配空白行; 

        检索test3中包含空白的行; -v 是取反,找到那些不是空白的行;


        wKiom1UbelCirT8eAABH__7NEHA674.jpg



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

锚定词首:\<  ,也可用\b  ;


            检索/etc/passwd 中,以root为词首的行; \>可以替换成为\b


               wKiom1UbewiTuXWqAABCZkCpaFo204.jpg


锚定词尾: \> , 也可用\b  ;

    

            检索/etc/passwd 中,以nologin为词尾的行; \>可以替换成为\b


                wKioL1UbfMrSLJ1NAAEU2Za-6UI269.jpg


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


           检索ifconfig 命令中 匹配2个数字的词;


                wKiom1UbfG3hRy7NAAD9geFSHuw032.jpg




分组:\(\)


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


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


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


"\(a.b\).*\1"  amb hello anb :是不能不能被匹配;要和匹配到括号的内容一样;

新建一个文档/tmp/test0 把一下内容写入;

                    test testr

                    toot ttttttot

                    tttt tttttt


                      wKioL1UbiIrztvvEAAA0wIUyW9s859.jpg


    "\(t..t\).*\1"  有用括号中匹配到的字符串;括号是什么内容,后面必须也包含;




二、扩展表达式:

    扩展正则表达式的表示方法:grep -E 或者 egrep ;这两钟方式表达都可以;扩展正则表达式和基本正则表达式基本的表示方法都一样,就是不用转意字符了"\",然后只多了一个或者 |

    

字符匹配:

    . :匹配任意单个字符

[]:匹配指定范围内的任意单个字符

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

[0-9],[[:digit:]]

[a-z],[[:lower:]]

[A-Z],[[:upper:]]

[[:space:]]

[[:punct:]]

[0-9a-zA-Z],[[:alnum:]]

[a-zA-Z],[[:alpha:]]

次数匹配:

*:任意长度,表示0次、1次或多次;

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

?:0次或1次;表示其左侧字符可有可恶

+ :1次或多次,前左边这个字符至少出现一次;

{m}:精确匹配m次,表示其左侧字符精确出现m次;


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

{0,n}:至多n次


{m,}: 至少m次

位置锚定:^:行首锚定;$:行尾锚定;\<,\b:词首锚定;\>,\b: 词尾锚定

分组表示:(),\1,\2

或者:a|b:a或者b  或者是匹配两侧的所有内容;


    检索/tmp/test3 中以C或c开头pu结尾的词;可以用egrep和grep -E两种表示方法来表示;


    wKioL1UbhxqCZNRUAABzYp4tyQs997.jpg



扩展正则表达式的表示方法:

   例子:


    正则表达式的方法:

        检索/etc/passwd文件中的二位或三位的数;


        wKioL1Ubib7SAXaRAAF60cKruho686.jpg

    

    扩展正则表达式的方法:

       

       检索/etc/passwd文件中的二位或三位的数;和正则表达式相比就是少了转意符;还可以用     

        # egrep '\<[0-9]{2,3}\>' /etc/passwd 来表示;这里的单词锚定符是不能去掉转意符的。 


        wKiom1UbiOLDOHWkAAF3FrCZACU775.jpg




fgrep:

 fgrep命令等同于grep -F,它利用固定的字符串来对文本进行搜索,但不支持正则表达式的引用,所以此命令的执行速度也最快。



PS:这是本人学习时整理的资料,有的是在网上搜索到的内容;如果遗漏欢迎大家来指导。