天天看點

grep以及正規表達式

grep:根據模式搜尋文本,并将符合模式的文本行列印出來

    -i:忽略大小寫

    -v:搜尋不符合模式的文本行

    -o:列印完全比對的字元

    --color:比對的字元高亮

    -A NUM:列印比對的文本行以及文本的後NUM行

    -B NUM:列印比對的文本行以及文本的前NUM行

    -C NUM:列印比對的文本行以及文本的前後NUM行

pattern:由文本字元和正規表達式的元字元組合而成

回顧下檔案名比對規則:

*:比對任意長度的任意字元

?:比對任意單個字元

[]:指定某個範圍内的單個長度字元

[^]:指定某個範圍外的單個長度字元

字元集合:

    [:space:]:空字元

    [:digit:]:數字

    [:lower:]:小寫字母

    [:upper:]:大寫字母

    [:alpha:]:大小寫字母

    [:alnum:]:大小寫字母以及數字集合

正規表達式:REGular EXPression

    基本正規表達式:Basic

    擴充正規表達式:Extended 指令:egrep,可以使用+,|等元字元

元字元:

.:比對任意單個字元

[]:範圍内的單個字元

[^]:範圍外的單個字元

    [:space:]:與檔案名比對規則一樣還有[:digit:]....等等

比對次數(貪婪模式:就是盡可能最大化比對,比如asabkslbss,我們使用a.*b模式時,它會比對asabkslb,而不是asab)

*:比對其前面的字元任意次數

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

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

\{m,n\}:至少比對m次,至多比對n次

為什麼使用\轉義{的原因:

    linux自帶花括号展開(比如ls -l /etc/{passwd,shadow}等價于 ls -l /etc/passwd /etc/shadow),如果不加轉義的會誤解   

位置錨定:

^:以其後面字元為行首的行

$:以其前面字元為行尾的行

    ^$:空白行

\<或\b:以其後面字元為詞首的行

\>或\b:以其前面字元為詞尾的行

分組:

    \(\)

     後向引用

    \1:引用第1個左括号以及與之對應的右括号所包含的所有内容

    \2:引用第2個左括号以及與之對應的右括号所包含的所有内容

    \3: ....

REGEXP中詞的概念:詞與詞之間以特殊字元作為分隔符其他字元視為詞的一部分比如sadjk&jj23342^&這個可以視為兩個詞 sadjk和jj23342

普通正規表達式示例:

    假設文本行中包含:a,b,ab,aab,acb,adb,amnb(每個單詞為一行,否則失去意義),請問a*b,a\?b,a.*b,分别比對哪些文本行

答案:a*b比對b,ab,aab,但是因為grep是部分比對是以除了a,其他文本行都會顯示出來,用grep --color可以看到比對到的字元

    a\?b:比對b和ab,一樣由于部分比對的原因,除了a,其他的也會顯示

    a.*b:比對ab,aab,acb,adb,amnb。

[root@logstach tmp]# cat test.txt 

a

b

ab

aab

acb

adb

amnb

[root@logstach tmp]# grep a*b test.txt

[root@logstach tmp]# grep 'a*b' test.txt

[root@logstach tmp]# grep 'a?b' test.txt

[root@logstach tmp]# grep 'a\?b' test.txt

[root@logstach tmp]# grep 'a.*b' test.txt

詞首詞尾錨定示例:

he is a sb

he is a  bigsb

sb250 is him

250sb also is  him

[root@logstach tmp]# grep  'sb\>'  test.txt 

[root@logstach tmp]# grep  '\<sb'  test.txt 

[root@logstach tmp]# grep  '\<sb\>'  test.txt 

sb\>錨定以sb作為詞尾的單詞,是以比對sb、bigsb、250sb,同樣地\<sb錨定以sb作為詞首的單詞

\<sb\>完全錨定sb。

分組後向引用示例:

He  love his lover.

She like her lover.

He like his liker

she  love  her liker.

假設我們要在上述文本行中找到類似于love ...lover 這種前後對應的行,而不要love...liker這樣額行,我們可以這樣做:

[root@logstach tmp]# grep  '\(l..e\).*\1' test.txt 

解析:l..e比對like和love,括号括起來表示這裡作為一個分組,.*表示中間跟任意一個字元,\1表示引用第一個分組。

擴充正規表達式:

字元比對:

.

[]

[^]

字元集:

次數比對:

*:

?:

+:比對其前面的字元至少一次   (相當于{1,})

{m,n}:m值不能為空    (基本正則也一樣)

^

$

\<

\>

():

\1 ,\2 ,\3...

或者

|:or

示例:

    C|cat:表示比對C或者cat,而不是Cat或者cat

cat

Cat

C

China

Cat123

[root@logstach tmp]# egrep 'C|cat' test.txt 

[root@logstach tmp]# egrep '\<C|cat\>' test.txt 

[root@logstach tmp]# egrep --color '\<(C|cat)\>' test.txt 

注意:這裡要想完全比對C|cat,則必須使用分組(),否則\<C|cat\>會被認為以C為詞首或者以cat為詞尾的單詞,我們把China變成小寫china,則會被過濾:

china

[root@logstach tmp]# egrep --color '\<C|cat\>' test.txt 

問題:用egrep過濾出ifconfig顯示的所有可用ip

提示:

    IPv4:

        A:1-127

        B:128-191

        C:192-223

答案:(不唯一)

ifconfig |egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>'

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

繼續閱讀