文本處理工具grep,正規表達式在Linux學習過程中很容易出現困惑與障礙的地方,這裡分享下學習這方面内容的一些感受。
grep Global search REgular expression and Print out the line
作用:文本搜尋工具,根據使用者指定的‘模式(過濾條件)’對目标文本逐行進行比對檢查;列印比對到的行;
‘模式’:由正規表達式的元字元及文本字元所編寫出的過濾條件。
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用選項:
-i:忽略字元大小寫
-o:僅顯示比對到的字元串本身
-v:顯示不能被模式比對到的行
-E:支援擴充正規表達式元字元
-q:靜默模式,比對不顯示
-A#:after,顯示比對條件所在行的後#行
-B#:before,顯示比對條件所在行的前#行
-C#:context,顯示比對條件所在行的前後#行
-n:顯示比對的行号(用的較少)
-c: 統計比對的行數(用的較少)
下面以幾個小實驗對grep的用法及選項做下具體的示範
實驗目錄/test 文本/test/head
1
2
3
4
5
6
7
8
9
<code>[root@localhost </code><code>test</code><code>]</code><code># cat head </code>
<code>12345 Sdabc saber </code>
<code>Berar bserac</code>
<code>12cds</code>
<code>67890</code>
<code>12</code>
<code>345</code>
<code>123</code>
<code>6</code>
<a href="http://s5.51cto.com/wyfs02/M00/85/85/wKioL1enLOHQBBq6AAA8VZfgRn8682.gif" target="_blank"></a>
正規表達式:Regual Expression,REGEXP
它由一類特殊字元及文本字元所編寫的模式,其中有些字元不表示其字面意義,而是用于表示控制或通配的功能。
它分兩類:基本正規表達式BRE、擴充正規表達式ERE
基本正規表達式元字元:
包括:字元比對、比對次數、位置錨定、分組
字元比對:
. :比對任意單個字元; [] :比對指定範圍内的任意單個字元
[^] :比對指定範圍外的任意單個字元
常用集合:[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
<a href="http://s3.51cto.com/wyfs02/M02/85/86/wKiom1enJHPSbB2mAAAOAbMrRZ4951.gif" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/85/85/wKioL1enJHSBRYXkAAAOp5xCHD0739.gif" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/85/86/wKiom1enJHTidiqIAAANM23CGag486.gif" target="_blank"></a>
比對次數:用在要指定次數的字元後面,用于指定前面的字元要出現的次數
*:比對前面的字元任意次,包括0次;貪婪模式:盡可能長的比對
.*:任意長度的任意字元
\?:比對其前面的字元0或1次
\+:比對其前面的字元至少1次
\{m\}:比對前面的字元m次
\{m,n\}:比對前面的字元至少m次,至多n次
\{,n\}:比對前面的字元至多n次
\{m,\}:比對前面的字元至少m次
<a href="http://s1.51cto.com/wyfs02/M02/85/85/wKioL1enJU_hYm2UAAAh7gQ1Uh8244.gif" target="_blank"></a>
位置錨定:定位出現的位置
^:行首錨定,用于模式的最左側
$:行尾錨定,用于模式的最右側
^PATTERN$: 用于模式比對整行
^$: 空行
^[[:space:]]*$ :空白行
單詞:非特殊字元組成的連續字元在Linux看來都稱單詞
\< 或\b:詞首錨定,用于單詞模式的左側
\> 或\b:詞尾錨定;用于單詞模式的右側
\<PATTERN\>:比對完整的單詞
<a href="http://s4.51cto.com/wyfs02/M00/85/86/wKiom1enKfmg9DkTAAAN_-0PJok776.gif" target="_blank"></a>
1、查找以for開頭的行
<a href="http://s3.51cto.com/wyfs02/M02/85/86/wKiom1enKfrRZcIhAAAMy8Leg-M242.gif" target="_blank"></a>
2、檢索隻含有for的字元串;檢索含有for的内容
3、檢索以for結尾的行;檢索以for結尾的字元串
<a href="http://s3.51cto.com/wyfs02/M00/85/85/wKioL1enKfrhkNqvAAAUSl5w1lg347.gif" target="_blank"></a>
分組:\(\):将一個或多個字元捆綁在一起,當作一個整體進行處理,如:\(root\)\+
分組括号中的模式比對到的内容會被正規表達式引擎記錄于内部的變量中,這些變量的命名方式為: \1, \2, \3, ...
\1: 從左側起,第一個左括号以及與之比對右括号之間的模式所比對到的字元;
執行個體:\(string1\+\(string2\)*\)
\1: string1\+\(string2\)*
\2: string2
後向引用:引用前面的分組括号中的模式所比對字元(而非模式本身)
<a href="http://s4.51cto.com/wyfs02/M02/85/85/wKioL1enK2mg9G-HAAAM4T6H4HY417.gif" target="_blank"></a>
上述指令意思是檢索包含有for字元串後跟任意字元且出現一次,連續出現上述情況兩次截取結果。後面的\1是重複第一個括号内的檢索對象。
egrep= grep -E
egrep[OPTIONS] PATTERN [FILE...]
擴充正規表達式的元字元:
字元比對:同基本正規表達式
次數比對:
*:比對前面字元任意次
?: 0或1次
+:1次或多次
{m}:比對m次
{m,n}:至少m,至多n次
位置錨定:同基本正規表達式
分組:
()
後向引用:\1, \2, ...
或者:
a|b
C|cat: C或cat
(C|c)at:Cat或cat
最後我們通過9個例子來感受grep與正規表達式結合所能實作的功能
1、顯示/proc/meminfo檔案中以大小s開頭的行
<a href="http://s3.51cto.com/wyfs02/M00/85/86/wKioL1enOhTjFKj3AAAZ2eDQ6FQ131.gif" target="_blank"></a>
這個隻需要知道grep的選項i就能輕松解決。
2、顯示/etc/passwd檔案中不以/bin/bash結尾的行
<a href="http://s2.51cto.com/wyfs02/M00/85/86/wKiom1enOiWhEjtbAABldH1yAcU272.gif" target="_blank"></a>
先使用grep檢索出包含有以“/bin/bash”結尾的行,再使用grep的-v取不以上面結果的行。類似數學中的補集效果。
3、找出ifconfig指令結果中本機的所有IPv4位址
<a href="http://s2.51cto.com/wyfs02/M00/85/86/wKioL1enOjiRNyOvAAA3quiV3Y0006.gif" target="_blank"></a>
這個分為三步:
1)通過grep鎖定包含有IPV4的行,這個通過分析ifconfig列出的資訊可以看出規律,隻要包含有IPv4的開頭都有inet這個字母,是以我們隻需要檢索它就行了
2)接下來使用tr将所有空替換為“:”并壓縮
3)使用cut實作結果。
4、查出分區空間使用率的最大百分比值
<a href="http://s5.51cto.com/wyfs02/M01/85/86/wKiom1enOmSgiGVhAAByMj9e38k462.gif" target="_blank"></a>
<a href="http://s5.51cto.com/wyfs02/M01/85/86/wKioL1enOmXh5z0yAAAvcobvGfo647.gif" target="_blank"></a>
這個大緻分6步:
1)過濾漢字
2)使用tr替換所有空為":"并壓縮
3)使用cut剪切出含有使用率百分比的數值
4)再次使用tr剔除%
5)使用sort按數值大小寫排序
6)使用tail取出最大值
5、顯示使用者rpc預設的shell程式
<a href="http://s1.51cto.com/wyfs02/M02/85/86/wKiom1enOnbgCk-MAAAXCtu3GCc540.gif" target="_blank"></a>
上面的檢索條件是以rpc為行首且以它為字元結尾的行
6、找出/etc/passwd中的兩位或三位數
<a href="http://s1.51cto.com/wyfs02/M02/85/86/wKioL1enOoawqYciAADHo1B8ojs316.gif" target="_blank"></a>
這裡使用的是擴充正規表達式因為可以是表達式更簡潔
這裡需要注意的是要以兩位或三位數為字元串,這需要對其進行開頭與結尾的字元錨定
7、找出/etc/rc.d/init.d/functions檔案中行首為某單詞(包括下劃線)後面跟一個小括号的行
<a href="http://s1.51cto.com/wyfs02/M00/85/86/wKiom1enOpeQbOJyAAAvRCxLKdk216.gif" target="_blank"></a>
當我們想好要過濾的條件後,要對其進行行首及字元的錨定,否則會導緻條件範圍不嚴謹
這裡要注意的是.*\>\(\),如果這裡改寫為.*\(\)\>則會失敗,具體可以自己想想。其實.*已經包括了"()",是以後面的是重複的,這樣就容易出錯。
8、使用egrep取出/etc/rc.d/init.d/functions中其基名
<a href="http://s1.51cto.com/wyfs02/M00/85/86/wKioL1enOqqhsZk8AAAXnJhJ6zU480.gif" target="_blank"></a>
<a href="http://s1.51cto.com/wyfs02/M01/85/86/wKiom1enOqrBIWfSAAAbhMWWp5g365.gif" target="_blank"></a>
上面是兩種方法,一種利用grep直接檢索出來,另一種的思想是分割。各有特點
9、利用擴充正規表達式分别表示0-9、10-99、100-199、200-249、250-255
\<[0-9]\>:0-9
\<[1-9][0-9]|>:10-99
\<1[0-9][0-9]\> | \<1[0-9]{2}\>:100-199
\<2[0-4][0-9]\> :200-249
\<25[0-5]\>:250-255
上面隻是對grep及正規表達式的簡要總結,不過隻要掌握好這基本的内容自己也就可以進行更深入的學習了。
本文轉自 紫色的茶碗 51CTO部落格,原文連結:http://blog.51cto.com/chawan/1835426,如需轉載請自行聯系原作者