1. 程式人生 > 實用技巧 >深入淺出grep與正則表示式

深入淺出grep與正則表示式

一、什麼是正則表示式

很可能我們經常會聽到一些有經驗的系統管理員告訴我們說:正則表示式非常重要。為什麼說正則表示式非常重要呢?因為我們在使用文字編輯的時候或者編寫shell指令碼的時候經常會使用到查詢、替換等工作。如果想把這些工作做的漂亮、完美、輕鬆就需要配合正則表示式來處理。那麼什麼是正則表示式呢?

簡單的說,正則表示式就是處理字串的方法,他是以行為單位來進行字串的處理行為,正則表示式通過一些特殊符號的輔助,可以讓管理員輕易達到查詢、刪除、替換、某些特定字串的處理程式。用一句簡單的話概括就是:正則表示式是一類使用字元所書寫的模式(pattern)。
二、正則表示式的用途

眾所周知,對於系統管理員來說,每天要面對的資料資訊多的無法想象,那麼如何從這些海量的資料資訊中找出我們需要的資料呢?

?如果只是用肉眼一行一行的檢視顯然是不現實的,此時系統管理員就需要通過正則表示式的功能來篩選出需要的資料資訊。正則表示式對於系統管理員最廣泛的用途就是清除伺服器中的垃圾資訊,例如清除郵件伺服器中的垃圾郵件。

三、正則表示式的分組

正則表示式的字串表示方式依照不同的嚴謹度而分為基本正則表示式與擴充套件正則表示式。擴充套件正則表示式除了簡單的一組字串處理之外,還可以做組的字串處理。例如("或""|")操作。

基本正則表示式元字元:

注:”\”表示轉義

^:錨定詞首

$:錨定詞尾

.:匹配任意單個字元

*:匹配任意長度的任意字元

[]:匹配指定範圍內的任意單個字元

[^]:匹配指定範圍外的任意單個字元


\?:匹配緊挨在其前面的字元0次或1

\{m,n\}:匹配其前面的字元至少m次至多n

\<:錨定詞首

>\:錨定詞尾

\():分組

擴充套件正則表示式字元:

注:元字元同基本正則表示式

+:匹配其前面的字元至少一次

|:二選一例如:a|b滿足a或者b均可

四、grep簡單介紹

grep:(GlobalSearchRegularExmpressionandPrinting全面搜尋正則表示式並把行打印出來)

grep的工作方式:它在一個或多個檔案中搜索字串模板(pattern)。搜尋的結果被送到螢幕,不影響原檔案內容。

語法:grep[option][--color=auto]“查詢字串”filename

--color=auto:找到的關鍵字自動新增顏色

-v:反向選取,只顯示不符合模式的行

-o:只顯示匹配到的字串,而不是整個行

-A#:顯示匹配到行時,順帶顯示其後面的#

-B#:顯示匹配到行時,順帶顯示其前面的#

-C#:顯示匹配到行時,順帶顯示其前後的#

-i:不區分大小寫

-EgrepE=egrep後接擴充套件的正則表示式

五、grep與正則表示式應用例項

注:系統環境RedHatEnterpriseLlnux6

例項中涉及到的管道命令不做詳細解釋

1.選出/etc/passwd檔案中以字母。

#grep --color=ahto "^[ad]" /etc/passwd

184700620.jpg

2.選出/etc/passwd檔案中以字串nologin結尾的行。

#gerp --color=auto "nologin$" /etc/passwd

184723539.jpg

3.顯示/etc/rc.d/rc.sysinit中符合形為“以任意單個字元n任意單個字元t結尾”模式的行

#gerp --color=auto ".n.t$" /etc/rc.d/rc.sysinit

184853890.jpg

4.匹配字元a零次或一次。注:grep.txt檔案自行建立

#gerp --color=auto "a\?b" grep.txt

184927553.jpg

5.找出/etc/passwd檔案中的1位數或2位數或3位數。

#gerp --color=auto "\<[0-9]\{1,3\}\>" /etc/rc.d/rc.sysinit

184947915.jpg

6.顯示/etc/rc.d/rc.sysinit中符合形為任意單個字元後面跟了個nn後面有任意單個字元,而後是任意單個字元後面跟了個n,但後面的n之前的字元與前面的n之前的字元相同。

#gerp --color=auto "\(.n\).\1" /etc/rc.d/rc.sysinit

185005659.jpg

7.找出/stc/passwd檔案中含有單詞binsbin中的行。

#egerp --color=auto "\<bin\>|\<sbin\>" /etc/rpasswd
#gerp -E --color=auto "\<bin\>|\<sbin\>" /etc/rpasswd

185034939.jpg

185035849.jpg

8.統計/etc/rc.d/rc.sysinit的空白行,非空白行,總行數。

#gerp  "^$" /etc/rc.d/rc.sysinit | wc -l
#gerp  -v "^$" /etc/rc.d/rc.sysinit | wc -l
#cat  /etc/rc.d/rc.sysinit | wc -l

185111311.jpg

9.取出預設shellbash,且其使用者ID號最小的使用者的使用者名稱。

#gerp --color=auto "/bin/bash$" /etc/passwd | sort -n -t: -k3 head -1 | cut -d: -f1

185130267.jpg

10.匹配點分十進位制IP地址。

模式(pattern):"\<([1-9]|[0-9][1-9]|1[0-9][0-9]|2[0-2][0-3])\.([0-9]|[0-9][1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[0-9][1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[0-9][1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"

ifconfig | egrep --color=auto "\<([1-9]|[0-9][1-9]|1[0-9][0-9]|2[0-2][0-3])\.([0-9]|[0-9][1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[0-9][1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[0-9][1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"

185148308.jpg

轉載於:https://blog.51cto.com/dreamwolf/1248753