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:

                wKiom1mKhJaS71cUAAAwV2OXqx4298.png-wh_50

            eg2:

                wKioL1mKhNDTQnY6AAAy2KBHqug253.png-wh_50

            eg3:

                wKioL1mKhQzAvX4aAAAdVL1HSB0059.png-wh_50

            eg4:

                wKiom1mKhjjAwIAOAAAwj_A_4Yk370.png-wh_50


    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以外的所有行

                wKiom1mKhteSpei5AABpz4cKcQg204.png-wh_50

            eg2:

                wKioL1mKh1iSMgVKAAAxx4yAgKc124.png-wh_50

            eg3:

                wKioL1mKh4WBE6lyAAA1CtQA_oU253.png-wh_50

            eg4:

                wKiom1mKh_CyHOrqAAA_TrSciAY366.png-wh_50

            eg5:

                wKioL1mKiBygUYfpAAAj4JUaUJY724.png-wh_50

            eg6:

                wKiom1mKiEyjZOgrAAAnRtk6G8U158.png-wh_50

            eg7:

                wKioL1mKiSGQEtI-AACAr_51KHg144.png-wh_50

            eg8:

                wKiom1mKiVSTA-pcAABqfpfz9sA338.png-wh_50

            eg9:

                wKioL1mKiZXztleSAACXuYNnbCw100.png-wh_50

            eg10:

                wKioL1mKijHj-PxxAABuXhz3cjQ572.png-wh_50

            eg11:

                wKiom1mKi9OSaFmmAAA1bjOujYk862.png-wh_50

三、正则表达式

    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:

                wKiom1mLEJ7hPlOtAABO20_B0ts537.png-wh_50

            eg2:

                wKiom1mLESDDEzeoAABa_VG3yrY579.png-wh_50

            eg3:

                wKioL1mLEpvhm0RnAAA71UP-5CA988.png-wh_50

                            

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

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

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

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

        \:转义符

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

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

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

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

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

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


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

                wKioL1mLE3qxHugHAAAR_XuSb1E669.png-wh_50


                wKiom1mLE_zyZKDnAAAkDIu1jBM033.png-wh_50

            eg2:

                wKiom1mLFJiSqZsMAAAhaMkWeNI940.png-wh_50

            eg3:

                wKiom1mLFk2y9uh3AAAh8pfXpAU399.png-wh_50

            eg4:

                wKioL1mLF4Wg-F8_AAAfzwMY4gQ112.png-wh_50

            eg5:

                wKioL1mLF-XgL8aHAAAm41d6Pk4276.png-wh_50

            eg6:

                wKioL1mLGJHiTqKsAAAlbIcbnNY143.png-wh_50

            eg7:

                wKioL1mLGQPQ70WzAAAg2idnVc0842.png-wh_50  


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

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

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

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

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

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

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

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

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


            eg1:

                wKiom1mLGX3xqD0ZAAAnZzYLYdc984.png-wh_50

            eg2:

                wKioL1mLGfqTGqw-AAEjxiDqnIc842.png-wh_50

            eg3:

                wKiom1mLGmrC1IM8AAAoKFSHYXk549.png-wh_50

            eg4:

                wKiom1mLGsPSylNcAAAT-oiIzPQ502.png-wh_50


                wKioL1mLG1DxRK7zAAA4HyWDFaw649.png-wh_50

            eg5:

                wKioL1mLHQrjWCf-AAAq8kNEWbY504.png-wh_50

            eg6:

                wKiom1mLHabQsR-MAABWs7Sd-Eg732.png-wh_50

            eg7:

                wKiom1mLHeTyhQxeAAAzXsLaKvA642.png-wh_50

            eg8:

                wKiom1mLHlGyBUe0AAAkgSp6tto283.png-wh_50

    

    分组

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

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

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

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

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

                  \2: string2

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


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

                wKiom1mMd7TBCMAXAAARwX-SM0I490.png-wh_50


                wKiom1mMeBijK1fCAAA4WLX9O50221.png-wh_50

            eg2:vim f2,添加以下内容

                wKiom1mMeFvghi7CAAAXB2bIf9k305.png-wh_50


                wKiom1mMeR-Depg8AABWcvsPKYg743.png-wh_50


                wKiom1mMelSxYpJaAABP14jbJp4569.png-wh_50


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

    egrep=grep -E;

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

            

            eg1:

                wKiom1mMesaiW7JWAABxTQDx2LE313.png-wh_50


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

    字符匹配

        任意单个字符;

        [] 指定范围的字符;

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


    次数匹配

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

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

        ?: 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;







      本文转自wzcLINUXER 51CTO博客,原文链接:http://blog.51cto.com/yacheng0316/1955797,如需转载请自行联系原作者





相关文章
|
1月前
|
运维 Unix Linux
grep正则表达式搜索
grep正则表达式搜索
16 3
|
6月前
|
Linux Perl
[笔记]linux grep之正则表达式
[笔记]linux grep之正则表达式
|
7月前
|
Unix Linux
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
191 5
|
10月前
|
机器学习/深度学习 NoSQL Linux
Linux行处理工具: grep 正则表达式
Linux行处理工具: grep 正则表达式
82 0
|
10月前
|
机器学习/深度学习 C语言 数据安全/隐私保护
『正则表达式』概念 及在grep、awk、sed、C语言、Python中的简单应用
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式。它可以用来检查一个字符串是否符合某个规则,或者从一个字符串中提取出符合某个规则的子串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。
|
12月前
|
机器学习/深度学习 移动开发 Go
正则表达式使用说明(包含find命令与grep命令)
正则表达式使用说明(包含find命令与grep命令)
108 0
|
自然语言处理 Shell Perl
Shell正则表达式(grep)
Shell正则表达式(grep)
52 0
|
机器学习/深度学习 Linux Perl
Linux三剑客grep、sed、awk以及正则表达式
$ 以...结尾 ^ 以...开头 . 匹配任意一个字符 \- 匹配前一个字符或子表达式任意次(例如:grep "g.*d" a.txt(过滤a.txt文件中的以g开头以d结尾*可以代表有任意多个字符或没有字符))
118 0
Linux三剑客grep、sed、awk以及正则表达式
|
机器学习/深度学习 Shell Linux