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