天天看點

Linux之文本處理三劍客之egre、fgrep

egrep是grep的另一種模式,用-E選項(啟用或關閉指令的某個或某些功能),啟用擴充正規表達式引擎功能,使用擴充正規表達式的字元和純文字字元組合的PATTERN,對文本流逐行比對檢查,将比對到的字元串所在的行顯示至标準輸出

fgrep,grep -F選項,關閉正規表達式引擎功能,以純文字字元組合為PATTERN,基于獨有的算法,對文本進行高效的比對檢查,将比對到的字元串所在的行顯示至标準輸出

egrep指令

1

2

3

4

5

6

7

8

9

<code>[root@izpo45bh60h6bsz ~]</code><code># type egrep</code>

<code>egrep</code> <code>is aliased to `</code><code>egrep</code> <code>--color=auto'</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># which --skip-alias egrep</code>

<code>/usr/bin/egrep</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># egrep --help          #擷取使用幫助</code>

<code>Usage: </code><code>grep</code> <code>[OPTION]... PATTERN [FILE]...</code>

<code>-E, --extended-regexp </code><code>#ERE</code>

<code>#其幫助内容同grep指令的使用内容</code>

-E選項, grep -E 相當于 egrep

<code># grep -E '^root\b' /etc/passwd</code>

<code># egrep '^root\b' /etc/passwd</code>

<a href="https://s5.51cto.com/wyfs02/M00/9D/6C/wKiom1l_-4nSQvzuAAASKk9Gtj0791.png" target="_blank"></a>

擴充正規表達式字元

    字元比對

    比對次數

    位置錨定

    或

字元比對

    1) .     任意單個字元

    2) []   指定範圍内的任意單個字元,  [abc] a或b或c 

    3) [^] 指定範圍外的任意單個字元

使用示例

<code>[root@izpo45bh60h6bsz ~]</code><code># vim a.txt #vim是一個文本編輯指令,進入後按i鍵,才可編寫文本,編寫完畢後。按esc鍵,再按shift 加 : 鍵,輸入wq加Enter鍵即可。</code>

<code>how are you?</code>

<code>hwo old are you?</code>

<code>HOW ARE YOU?</code>

<code>HWO OLD ARE YOU?</code>

<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

 .   比對任意單個字元

<code># egrep  'r..t' a.txt</code>

<a href="https://s4.51cto.com/wyfs02/M01/9D/6B/wKiom1l_9XPBxNdCAAAII9Gqxjs786.png" target="_blank"></a>

[]   比對指定範圍内的任意單個字元,  [abc] a或b或c 

<code># egrep  '[eFH]' a.txt</code>

<a href="https://s5.51cto.com/wyfs02/M02/9D/6B/wKioL1l_9jTRilLBAAANEkuiAm0800.png" target="_blank"></a>

[^] 表示指定範圍外的任意單個字元, [^abc] 非a和b和c

<code># egrep  '[^eFH]' a.txt</code>

<a href="https://s4.51cto.com/wyfs02/M00/9D/6B/wKioL1l_9qHhcXYrAAAP5fCxW4w214.png" target="_blank"></a>

次數比對 前面單個字元出現的次數

    1)*  比對前面單個字元,出現0、1或多次

    2)?  比對前面單個字元,出現0或1次

    3)+  比對前面單個字元,出現至少1次,&gt;=1次

    4){m}  精确比對前面單個字元m次

    5){m,} 比對前面單個字元,至少m次

    6){,n} 至多n次

    7){m,n}  至少m次,至多n次

<code>[root@izpo45bh60h6bsz ~]</code><code># vim output_delimiter.txt</code>

<code>ab</code>

<code>cb</code>

<code>a12b</code>

<code>aab</code>

<code>abb</code>

<code>abababababababab</code>

*  比對前面單個字元,出現0、1或多次

<code># egrep 'a*b' output_delimiter.txt</code>

<a href="https://s2.51cto.com/wyfs02/M01/9D/6C/wKioL1l_-cGQr_jrAAAN5cuhiEM442.png" target="_blank"></a>

.* 比對 . 任意次,任意單個字元任意次,任意長度任意字元,(glob中的*)

<code># egrep  'r.*t' a.txt</code>

?  比對前面單個字元,出現0或1次 (基本正規表達式中 \? )

<code># egrep 'a?b'  output_delimiter.txt </code>

<code># grep 'a\?b'  output_delimiter.txt</code>

<a href="https://s1.51cto.com/wyfs02/M01/9D/6C/wKioL1l__DLDa2I4AAAOP4Ub1Eo129.png" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M00/9D/6C/wKioL1l__MDSLdFlAAAOcDSorS4432.png" target="_blank"></a>

+  比對前面單個字元,出現至少1次,&gt;=1次 (基本正規表達式中 \+ )

<code># egrep 'a+b'  output_delimiter.txt</code>

<code># grep 'a\+b'  output_delimiter.txt</code>

<a href="https://s3.51cto.com/wyfs02/M00/9D/6C/wKioL1l__R_DbUTWAAAL9nJFM_U113.png" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M01/9D/6C/wKiom1l__VCRMo_pAAAMHGZ4GmA580.png" target="_blank"></a>

{m}  精确比對前面單個字元m次 (基本正規表達式中 \{m\} )

<code># egrep 'a{3}b' output_delimiter.txt</code>

<code># grep 'a\{3\}b' output_delimiter.txt</code>

<a href="https://s4.51cto.com/wyfs02/M00/9D/6C/wKioL1l__euSEVCIAAAJy3qyw7M183.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M01/9D/6C/wKiom1l__g3gLEtcAAAKIv1jrDs324.png" target="_blank"></a>

{m,} 比對前面單個字元,至少m次 (基本正規表達式中 \{m,\} )

<code># egrep 'a{3,}b' output_delimiter.txt</code>

<code># grep 'a\{3,\}b' output_delimiter.txt</code>

<a href="https://s2.51cto.com/wyfs02/M01/9D/6C/wKioL1l__pWjaf3GAAAJsFepLwQ209.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/9D/6C/wKiom1l__qazqraWAAAKMyMLfvk260.png" target="_blank"></a>

{,n} 比對前面單個字元至多n次 (基本正規表達式中 \{m,\} )

<code># egrep 'a{,2}b' output_delimiter.txt</code>

<code># grep 'a\{,2\}b' output_delimiter.txt</code>

<a href="https://s2.51cto.com/wyfs02/M02/9D/6C/wKiom1l__9HxtL69AAAPF6-VNYg631.png" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M00/9D/6C/wKioL1l__2rhls23AAAPRHJw3ZU952.png" target="_blank"></a>

{m,n}  比對前面單個字元至少m次,至多n次 (基本正規表達式中 \{m,n\} )

<code># egrep 'a{3,6}b' output_delimiter.txt</code>

<code># grep 'a\{3,6\}b' output_delimiter.txt</code>

<a href="https://s4.51cto.com/wyfs02/M00/9D/6C/wKiom1mAAGfjxENaAAAT-AQJe5M387.png" target="_blank"></a>

位置錨定 ‘期望比對的字元必須出現在某個位置’

    1)^ 行首錨定,用于模式最左側。由正規表達式所比對到的字串符必須出現在行首

    2)$ 行尾錨定,用于模式最右側。由正規表達式所比對到的字串符必須出現在行尾

    3)^pattern$: 整行隻能比對此模式

    4)比對空白行: ^[[:space:]]*$ 空白可有任意次數

    5)\&lt; 或 \b 詞首錨定,用于單詞模式的左側

    6)\&gt; 或 \b 詞尾錨定,用于單詞模式的右側

    7) \&lt;PATTERN\&gt; 或 \bPATTERN\b 比對整個單詞,用于單詞左右兩側

    8)分組,後向引用 ()

^ 行首錨定,用于模式最左側。由正規表達式所比對到的字串符必須出現在行首

<code># grep -E '^root' /etc/passwd</code>

<a href="https://s4.51cto.com/wyfs02/M00/9D/6D/wKioL1mABmvyjIy1AAAQrKtD4Ss937.png" target="_blank"></a>

$ 行尾錨定,用于模式最右側。由正規表達式所比對到的字串符必須出現在行尾

<code># grep -E '/bin/bash$' /etc/passwd</code>

<a href="https://s2.51cto.com/wyfs02/M02/9D/6D/wKioL1mABsTjvcDyAABNVhnmns4443.png" target="_blank"></a>

^pattern$: 整行隻能比對此模式

<code># grep -E -c '^$' /etc/init.d/functions            #比對空行</code>

<code>-c 顯示比對到的字串所在行的所有行的行數</code>

比對空白行: ^[[:space:]]*$ 空白可有任意次數

<code># grep -E -c '^[[:space:]]*$' /etc/init.d/functions  #比對可為空行或有空白字元的行</code>

\&lt; 或 \b 詞首錨定,用于單詞模式的左側

<code># grep -E '\broot' /etc/passwd</code>

\&gt; 或 \b 詞尾錨定,用于單詞模式的右側

<code># grep -E 'root\b' /etc/passwd</code>

\&lt;PATTERN\&gt; 或 \bPATTERN\b 比對整個單詞,用于單詞左右兩側

<code># grep -E '\broot\b' /etc/passwd</code>

( ) 分組, (基本正規表達式中 \(\) ) 将任意個字元目前同一個元件

<code># cat grep.txt </code>

<code>abxy</code>

<code>xxxxxxy</code>

<code>xyxyxyxyabcxy</code>

<code># grep -E '(xy)+' grep.txt</code>

<a href="https://s2.51cto.com/wyfs02/M01/9D/6D/wKiom1mABaHhtcfrAAAJZiiJ5ys160.png" target="_blank"></a>

<a href="https://s3.51cto.com/wyfs02/M01/9D/6D/wKioL1mABcCgwK04AAAJvgkac4g213.png" target="_blank"></a>

注意:

    表示字元串本身時,如果使用的指令使用的正規表達式字元,有\,則不用\; 如果沒有\,則加\。

<code># grep -o '[[:alpha:]_]\+()' /etc/rc.d/init.d/functions  #正規表達式字元為 \( \)</code>

<code>grep</code> <code>-E -o </code><code>'[[:alpha:]_]+\(\)'</code> <code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code> <code>#擴充正規表達式字元為 ( )</code>

後向引用,分組括号中的模式比對到的内容會被正規表達式引擎記錄于内部的變量中,這些變量的命名方式為:\1,\2,\3

<code># grep -E '(^[[:alnum:]]+\&gt;).*\1$' /etc/passwd</code>

<a href="https://s4.51cto.com/wyfs02/M01/9D/6D/wKiom1mACGXgrMPuAAAVp_KTtEQ359.png" target="_blank"></a>

    [cCat]    c或C或a或t

    c|Cat     c或Cat

    (c|C)at   cat 或 Cat

<code># vim dsdcI.txt</code>

<code>cat</code>

<code>Cat</code>

<code>c12</code>

<code>C123</code>

<code>at</code>

1、[cCat] 比對指定範圍内的任意單個字元

<code># egrep '[cCat]' dsdcI.txt</code>

<a href="https://s4.51cto.com/wyfs02/M01/9D/6D/wKioL1mACx2A4xSxAAAKCszkeZc503.png" target="_blank"></a>

2、c|Cat  比對c 或 Cat

<code># egrep 'c|Cat' dsdcI.txt</code>

<a href="https://s5.51cto.com/wyfs02/M00/9D/6D/wKiom1mAC2jCxlKbAAAIjdA3gP0001.png" target="_blank"></a>

3、(c|C)at 比對 cat 或 Cat

<code># egrep '(c|C)at' dsdcI.txt</code>

<a href="https://s2.51cto.com/wyfs02/M00/9D/6D/wKioL1mAC77hl50wAAAH_aidxsA632.png" target="_blank"></a>

總結:

列印比對到的字元所在的行

egrep與grep元字元相同的使用

.  [ ]  [^]  \&lt;  \&gt;  \b  ^  $  *  .*

egrep與grep元字元的不同使用

grep

\?

\+

\{m,n\}

\(\)

egrep

+

{m,n}

()

|

egrep 或 “grep并不支援”

[abcd] 字元級别的或

c|cat 左側整體或右側整體

(c|c)at 分組或

本文轉自 lccnx 51CTO部落格,原文連結:http://blog.51cto.com/sonlich/1952624,如需轉載請自行聯系原作者

繼續閱讀