一、Linux文本处理三剑客、grep家族和正则表达式介绍

     Linux上文本处理三剑客:

        grep(egrep, fgrep):文本搜索工具;基于”pattern(过滤条件)“对目标文本进行逐行搜索操作;

        sed:Stream Editor,流编辑器行编辑工具;文本编辑工具;

        awk:GNU awk,文本格式化工具;文本报告生成器;


    grep家族:

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

        egrep:支持使用扩展正则表达式,相当于grep -E;

        fgrep:不支持使用正则表达式(本文暂不介绍);

    作为Linux文本处理三剑客之一的grep家族,是我们经常会使用到的文本搜索工具。grep、egrep是基于“pattern(过滤条件)”对目标文本进行逐行匹配,然后输出符合条件的行内容。“pattern(过滤条件)”由文本字符及相应的正则表达式元字符所组成。


    正则表达式:由一些特殊字符和文本字符所编写,其中一些字符所表示意义并不是其字面意义,而是表示控制或功能。

    正则表达式分为两类:

        基本正则表达式:BRE

        扩展正则表达式:ERE

    正则表达式引擎:利用正则表达式模式分析所给定的文本的程序。


二、grep命令和基本正则表达式

    grep  [OPTIONS]  PATTERN  [FILE...]

    常用选项:

        --color=auto:对匹配到的文本着色后高亮显示(centos7默认对grep、egrep、fgrep已经设置参数)

    linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式

        -i:忽略字符大小写;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_02

        -o:仅显示匹配 到的文本自身;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_03

          -v, --invert-match:反向匹配;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_04

        - q, --quiet, --silient:静默模式,不输出任何信息;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_05

        -e PATTERN, --regexp=PATTERN:多模式机制;

    linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_06

        -f FILE, --file=FILE:FILE为每行包含了一个pattern的文本文件,即grep script;

    linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_07

        -A NUM, --after-context=NUM:显示查找内容每行的下NUM行

    linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_08

        -B NUM, --before-context=NUM:显示查找内容每行的上NUM行 

    linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_09

        -C NUM, -NUM, --context=NUM:显示查找内容每行的上下NUM行 

   linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_linux_10

        -E, --extended-regexp:支持使用扩展正则表达式

        -F, --fixed-strings:支持使用固定字符串,不支持正则表达式,相当于fgrep;

        -G, --basic-regexp:支持使用基本正则表达式;

        -P, --perl-regexp:支持使用pcre正则表达式;

               


    基本正则表达式元字符:

        字符匹配:

             .:匹配任意单个字符;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_11

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

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_12

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

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_linux_13

            [[:digit:]]:任意数字;

            [[:lower:]]:任意小写字母;

            [[:upper:]]:任意大写字母;

            [[:alpha:]]:任意字母;

            [[:alnum:]]:任意的字母和数字;

            [[:space:]]:空白字符;

            [[:blank:]]:空格和Tab键等;

            [[:punct:]]:所有的标点符号。


        匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;

            *:匹配其前面的字符任意次;0,1,多次;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_14

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

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_15

            \?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_16

            \+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_17

            \{m\}:匹配其前面的字符m次;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_linux_18

            \{m,n\}:匹配其前面的字符至少m次,至多n次;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_linux_19

            \{0,n\}:匹配其前面的字符至多n次

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_20

            \{m,\}:匹配其前面的字符至少m次

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_21


        位置锚定:

            ^:行首锚定;用于模式的最左侧;

            $:行尾锚定;用于模式的最右侧;

            ^PATTERN$:用于PATTERN来匹配整行;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_22


            ^$:空白行;

            ^[[:space:]]*$:空行或包含空白字符的行;



            单词:非特殊字符组成的连续字符(字符串)都称为单词;

            \< 或 \b:词首锚定,用于单词模式的左侧;

            \> 或 \b:词尾锚定,用于单词模式的右侧;

            \<PATTERN\>:匹配完整单词;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_正则_23


        分组及引用

           \(PATTERN\):将此PATTERN匹配到的字符当作一个不可侵害整体进行处理。

           Note:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,

                      这些变量是\1, \2, \3, ...


                        pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)


            \n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;

                  (不是模式,而是模式匹配的结果)


            \1:第一组括号中的pattern匹配到的字符串;

            \2:第二组括号中的pattern匹配到的字符串;

            ……

            后向引用:引用前面的分组括号中的模式所匹配到的字符;

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_表达式_24


三、egrep命令和扩展正则表达式

    egrep [OPTIONS] PATTERN [FILE...]

    注:常用选项与grep一致,参考上述grep的常用选项即可。


    扩展正则表达式的元字符:

        字符匹配:

            .:任意单个字符

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_linux_25

            [ ]:范围内的任意单个字符

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_linux_26

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

        linux文本处理三剑客之grep家族及其相应的正则表达式使用详解_linux_27


        匹配次数:

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

            ?:匹配前面的0次或1次,即前面的字符可有可无

            +:匹配前面的字符至少1次

            {m}:其前面的字符出现m次,m为非负整数

            {m,n}:其前面的字符出现m次,m为非负整数

            {0,n}:匹配其前面的字符至多n次;

            {m,}:匹配其前面的字符最少m次;

        注:使用方式与基本正则表达式相同,参考上述基本正则表达式的使用介绍即可。


        位置锚定:

            ^:行首锚定;用于模式的最左侧,^PATTERN

            $:行尾锚定;用于模式的最右侧,PATTERN$

            \<, \b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN

            \>, \b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b

        注:使用方式与基本正则表达式相同,参考上述基本正则表达式的使用介绍即可。


        分组及引用:

            (PTARRERN):将此PATTERN匹配到的字符当作一个不可侵害整体进行处理。

            Note:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,

                       这些变量是\1, \2, \3, ...

                        pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)

            \n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;

                  (不是模式,而是模式匹配的结果)

            \1:第一组括号中的pattern匹配到的字符串;

            \2:第二组括号中的pattern匹配到的字符串;

            ……

            后向引用:引用前面的分组括号中的模式所匹配到的字符;

        注:使用方式与基本正则表达式相同,参考上述基本正则表达式的使用介绍即可。


         或者:

                a|b:a或者b

                C|cat:表示C或cat

                (C|c)at:表示Cat或cat