首页 > 代码库 > grep和正则表达式详解

grep和正则表达式详解

一、Linux上文本处理三剑客

    grep:文本过滤(模式:pattern)工具;

    sed:文本编辑工具;

    awk:Linux上的实现gawk,文本报告生成器;

二、grep

    grep:Global search REgular expression and Print out the line,是一款文本过滤(模式:pattern)工具。

    作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;

    模式:由正则表达式字符及文本字符所编写的过滤条件。

    grep语法:

        grep [OPTIONS] [PATTERN] [FILE...]

            eg1:

                技术分享

            eg2:

                技术分享

            eg3:

                技术分享

            eg4:

                技术分享


    OPTIONS:

        --color=auto: 对匹配到的文本着色显示; 

        -v: 显示不能够被pattern匹配到的行; 

         -i: 忽略字符大小写;

        -n:显示匹配的行号; 

        -c: 统计匹配的行数; 

        -o: 仅显示匹配到的字符串; 

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

        -A #: after, 后#行; 

        -B #: before, 前#行; 

        -C #:context, 前后各#行; 

        -e:实现多个选项间的逻辑or关系;

            grep –e ‘cat ’  -e ‘dog’ file 

        -w:整行匹配整个单词; 

        -E:使用ERE;

    示例:

            eg1:匹配除了root以外的所有行

                技术分享

            eg2:

                技术分享

            eg3:

                技术分享

            eg4:

                技术分享

            eg5:

                技术分享

            eg6:

                技术分享

            eg7:

                技术分享

            eg8:

                技术分享

            eg9:

                技术分享

            eg10:

                技术分享

            eg11:

                技术分享

三、正则表达式

    3.1 正则表达式REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能;

    3.2 正则表达式分为两类:

        3.2.1 基本正则表达式:BRE

        3.2.2 扩展正则表达式:ERE

    3.3 grep工具支持基本的正则表达式,egrep支持扩展的正则表达式,并且grep的-E选项其实就是egrep,fgrep不支持正则表达式搜索;

    3.4 正则表达式引擎:

        3.4.1 采用不同算法,检查处理正则表达式的软件模块;

        3.4.2 PCRE(PerlCompatible Regular Expressions); 

    3.5 元字符分类:字符匹配、匹配次数、位置锚定、分组;

    3.6 正则表达式详细使用帮助文档:man 7 regex;

四、基本正则表达式元字符

    字符匹配:

        .   :匹配任意单个字符;

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

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

        [:alnum:]所有的字母和数字

        [:upper:] 所有的大写字母

        [:lower:] 所有的小写字母

        [:alpha:] 所有的字母(不区分大小写)  

        [:space:] 所有空白字符

        [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

        [:digit:] 所有的数字

        [:xdigit:]十六进制数字

        [:graph:] 可打印的非空白字符

        [:print:] 可打印字符

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


            eg1:

                技术分享

            eg2:

                技术分享

            eg3:

                技术分享

                            

    次数匹配:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

        *:匹配前面的字符任意次,包括0次

            贪婪模式:尽可能长的匹配

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

        \:转义符

        \?:匹配其前面的字符0或1次

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

        \{n\}:匹配前面的字符n次

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

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

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


            eg1:(vim f3,在f3文件里添加以下内容,如图所示)

                技术分享


                技术分享

            eg2:

                技术分享

            eg3:

                技术分享

            eg4:

                技术分享

            eg5:

                技术分享

            eg6:

                技术分享

            eg7:

                技术分享  


    位置锚定:对特定的位置进行定位

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

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

        ^PATTERN$: 用于模式匹配整行

        ^$: 空行,不含有空白字符的行;

        ^[[:space:]]*$ :空白行,含有空白字符的行(空格和tab),匹配的时候包含空行;

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

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

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


            eg1:

                技术分享

            eg2:

                技术分享

            eg3:

                技术分享

            eg4:

                技术分享


                技术分享

            eg5:

                技术分享

            eg6:

                技术分享

            eg7:

                技术分享

            eg8:

                技术分享

    

    分组

        分组是指将一个或多个字符捆绑在一起,当做一个整体进行处理,其符号为:\(\);例如:\(root\)\+;

        分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ... ;

        \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;

            实例:\(string1\+\(string2\)*\)

                  \1: string1\+\(string2\)*

                  \2: string2

        后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)


            eg1:vim f1,添加以下内容,如图所示

                技术分享


                技术分享

            eg2:vim f2,添加以下内容

                技术分享


                技术分享


                技术分享


五、egrep及扩展的正则表达式

    egrep=grep -E;

    格式:egrep [OPTIONS] PATTERN [FILE...]

            

            eg1:

                技术分享


六、扩展正则表达式元字符

    字符匹配

        . 任意单个字符;

        [] 指定范围的字符;

        [^] 不在指定范围的字符;


    次数匹配

        *:匹配前面字符任意次;

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

        ?: 0次或1次;

        +:至少一次;

        {m}:精确匹配m次;

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

        {m,}:至少m次;

        {,n}:至多n次;


    位置锚定

        ^  :行首;

        $  :行尾;

        \<, \b :语首; 

        \>, \b :语尾 ;


    分组

        符号:()

        后向引用:\1, \2,...  

    或者: 

        a|b:a或b;

        C|cat: C或cat;

        (C|c)at:Cat或cat;




    



            

    

本文出自 “亚成-另一个LINUXER” 博客,请务必保留此出处http://yacheng0316.blog.51cto.com/11878883/1955797

grep和正则表达式详解