天天看點

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:

            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:] 所有的标點符号

    次數比對:用在要指定次數的字元後面,用于指定前面的字元要出現的次數

        *:比對前面的字元任意次,包括0次

            貪婪模式:盡可能長的比對

        .*:任意長度的任意字元

        \:轉義符

        \?:比對其前面的字元0或1次

        \+:比對其前面的字元至少1次

        \{n\}:比對前面的字元n次

        \{m,n\}:比對前面的字元至少m次,至多n次

        \{,n\}:比對前面的字元至多n次

        \{n,\}:比對前面的字元至少n次

            eg1:(vim f3,在f3檔案裡添加以下内容,如圖所示)

            eg4:

            eg5:

    位置錨定:對特定的位置進行定位

        ^:行首錨定,用于模式的最左側

        $:行尾錨定,用于模式的最右側

        ^PATTERN$: 用于模式比對整行

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

        ^[[:space:]]*$ :空白行,含有空白字元的行(空格和tab),比對的時候包含空行;

        \< 或 \b:詞首錨定,用于單詞模式的左側

        \> 或 \b:詞尾錨定;用于單詞模式的右側

        \<PATTERN\>:比對整個單詞

    分組

        分組是指将一個或多個字元捆綁在一起,當做一個整體進行處理,其符号為:\(\);例如:\(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...]

六、擴充正規表達式元字元

    字元比對

        . 任意單個字元;

        [] 指定範圍的字元;

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

    次數比對

        *:比對前面字元任意次;

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

        ?: 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,如需轉載請自行聯系原作者