grep和正則表達式詳解

1、Linux上文本處理三劍客git

    grep:文本過濾(模式:pattern)工具;正則表達式

    sed:文本編輯工具;
算法

    awk:Linux上的實現gawk,文本報告生成器;
express

2、grepvim

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

    做用:文本搜索工具,根據用戶指定的「模式」對目標文本逐行進行匹配檢查;打印匹配到的行;工具

    模式:由正則表達式字符及文本字符所編寫的過濾條件。
spa

    grep語法:
blog

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

            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、正則表達式

    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;

4、基本正則表達式元字符

    字符匹配:

        .   :匹配任意單個字符;

        []  :匹配指定範圍內的任意單個字符

        [^] :匹配指定範圍外的任意單個字符

        [: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


5、egrep及擴展的正則表達式

    egrep=grep -E;

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

            

            eg1:

                wKiom1mMesaiW7JWAABxTQDx2LE313.png-wh_50


6、擴展正則表達式元字符

    字符匹配

        . 任意單個字符;

        [] 指定範圍的字符;

        [^] 不在指定範圍的字符;


    次數匹配

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

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

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

相關文章
相關標籤/搜索