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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文本处理三剑客之grep家族及其相应的正则表达式使用详解相关的知识,希望对你有一定的参考价值。

一、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已经设置参数)

    技术分享

        -i:忽略字符大小写;

        技术分享

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

        技术分享

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

        技术分享

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

        技术分享

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

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

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

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

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

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

        -A NUM, --after-context=NUM

        -B NUM, --before-context=NUM

        -C NUM, -NUM, --context=NUM


    基本正则表达式元字符:

        字符匹配:

             .:匹配任意单个字符;

        技术分享

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

        技术分享

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

        技术分享

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

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

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

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

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

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

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

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


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

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

        技术分享

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

        技术分享

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

        技术分享

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

        技术分享

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

        技术分享

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

        技术分享

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

        技术分享

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

        技术分享


        位置锚定:

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

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

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

        技术分享


            ^$:空白行;

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


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

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

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

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

        技术分享


        分组及引用

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

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

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

            \n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)

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

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

            ……

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

        技术分享


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

    egrep [OPTIONS] PATTERN [FILE...]

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


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

        字符匹配:

            .:任意单个字符

        技术分享

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

        技术分享

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

        技术分享


        匹配次数:

            *:匹配前面的字符任意次(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

以上是关于linux文本处理三剑客之grep家族及其相应的正则表达式使用详解的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本处理工具三剑客之grep

文本处理三剑客之---grep系

Linux操作系统基础解析之——grep命令家族及正则表达式初识

linux12shell编程 --> 三剑客之grep命令

Linux三剑客之grepegrep及正则表达式使用详解

linux文本处理三剑客之grep