2021-05-12 14:32:11
Linux基礎之grep和正規表示式
在使用系統時,我們或多或少的有一些搜尋、查詢的需求,必須要在文字中搜尋某個關鍵字,或者過濾出文字中某些特定的行。grep 命令就為我們提供了這樣一個功能,同時,grep 還可以使用正規表示式進行匹配,這是一個強大的功能,有必要好好掌握。
1.grep 初體驗
grep PATTERN [OPTIONS] FILE:在檔案中按照模式進行查詢。FILE 是我們要查詢的目標檔案,如果不指定目標檔案,grep 將會從標準輸入中讀取輸入的內容,然後進行匹配。為了方便起見,本文的所有演示都在命令列中通過標準輸入進行。
- grep PATTERN:最基本的用法,根據 PATTERN 進行查詢
如果沒有高亮顯示匹配到的內容,可以手動指定:grep --color PATTER 進行匹配,更可以使用命令別名,減少我們的輸入時間:alias grep="grep --color"。
- grep PATTERN -i:忽略大小寫匹配
- grep PATTERN -v:反轉輸出。匹配到的內容不輸出,只輸出沒被匹配到的內容。
- grep PATTERN -o:只顯示匹配到的字串(PATTERN)。預設顯示匹配到的字串所在的整行文字。
2.grep 和正規表示式
正規表示式(Regular Expression 或 REGEXP)分為基礎正規表示式(Basic REGEXP)和擴充套件正規表示式(Extended REGEXP)。grep 預設採用基礎正規表示式,如需使用擴充套件正規表示式需要附加選項。
由於介紹正規表示式實在太過複雜,我想了很久也無法很好的組織語言,因此這裡就不再對正則中的元字元進行一一的介紹了。需要了解這方面的同學,可以去看一下三十分鐘入門正規表示式系列的教學,應該很快就能學會。
- 使用 grep 進行簡單的正則匹配
"[]" 表示匹配 [] 中出現的任意一個字元,[a-zA-Z] 表示匹配所有的英文字母。
"[^]" 表示匹配出去 [] 中出現的字元之外的任意字元。
在正規表示式中,'*' 號不再表示任意字元,而表示其前的字元可以出現任意次。有時候我們在命令中使用 '*' 進行萬用字元匹配檔案,要注意它在正規表示式中的不同用法。在正則表示中使用 '.' 點號來匹配任意字元。
在正則中,'.' 點號表示不為空的任意字元。
".*" 表示匹配出現任意次數的任意字元。正規表示式預設處於貪婪模式,因此在第一次匹配到結果後,還會進行多次匹配,知道沒有匹配為止。
"?" 表示匹配前面的字元出現 0 次 或者 1 次,注意這個問號需要被跳脫。
"{m,n}" 表示前面的字元出現最少 m 次,最大 n 次。"{m,}" 表示前面的字元至少出現 m 次,"{,n}" 表示前面的字元至多出現 n 次。
'^' 和 '$' 是正規表示式中的兩個位置錨定。'^' 表示其後的字元必須出現在行首,而 '$' 表示其前的字元必須出現在行尾,"^$" 表示匹配空白字元。
"<" 和 ">" 用來錨定單詞,二者不一定要成對出現,也可以使用 "b" 進行錨定。"bWORD" (或者 "<WORD>") 表示匹配以 WORD 開頭的單詞,"WORDb" 表示匹配以 WORD 結尾的單詞,"bWORDb" 表示完完全全匹配 WORD 單詞。
"()" 表示對 PATTERN 進行分組,分組還支援後向參照,使用 "1","2" 等參照前面的分組。後向參照只匹配和前面相同的內容。
'|' 表示或,匹配其前或者其後的單詞,注意並不是匹配字元,如需匹配字元,需要使用分組進行限定。我這裡使用的是擴充套件正則,如需使用基本正則,需要將 '|' 換為 "|"。
3.擴充套件正規表示式
grep 同時還支援擴充套件正規表示式,在使用擴充套件正規表示式是,需要使用 -E 選項。基礎正規表示式和擴充套件正規表示式中的一些區別:
- 基礎正則中使用 ?,擴充套件正則中使用 ?
- 基礎正則中使用 (),擴充套件正則中使用 ()
- 基礎正則中使用 {},擴充套件正則中使用 {}
在基礎正規表示式中匹配 ?,(),{} ,不需要進行轉移,而在擴充套件正規表示式中則需要加上跳脫符號 。
擴充套件正規表示式中的其他選項:
- s:匹配空白字元
- S:匹配非空白字元
- w:匹配字母,數位,相當於 [0-9a-zA-Z]
- W:不匹配字母和數位,相當於 [^0-9a-zA-Z]
4.grep 的其他選項
- grep PATTERN FILE -A NUM:使用 grep 進行匹配之後,顯示匹配的行,同時向後顯示指定的行
- grep PATTERN FILE -B NUM:和上面相反,向後顯示指定行
- grep PATTERN FILE -C NUM:進行匹配之後,分別向前和向後顯示指定的行,相當於 -AB NUM
- grep PATTERN FILE -c:顯示被匹配到的行數
- grep PATTERN FILE -F:相當於 fgrep
- grep PATTERN FILE -P:使用 Perl 風格的正規表示式
- d:匹配任意十進位制數位,相當於 [0-9]
- D:匹配任意非數位字元,相當於 [^0-9]
5.egrep 和 fgrep
在使用 grep 時,如果想要開啟擴充套件正規表示式,需要指定 -E 選項,而 egrep 命令則是預設支援擴充套件正規表示式。因此在需要使用擴充套件正規表示式時推薦使用 egrep 代替 grep -E。
fgrep 表示快速匹配,不支援正規表示式,沒有跳脫的概念,會對 PATTERN 中的所有字元進行匹配。
6.總結
本篇我們介紹了 grep 命令和正規表示式的基本使用,grep 是 Linux 下的一個文字處理命令,配合正規表示式使用,其功能非常強大。grep 主要用來查詢操作,如果想使用替換等更加強大的功能,就需要使用 sed 或者 awk 命令。grep,sed,awk 被稱為 Linux 下的三個文字處理殺器,等學到相應的章節再繼續介紹 :)
grep使用簡明及正規表示式 http://www.linuxidc.com/Linux/2013-08/88534.htm
正規表示式的用法 http://www.linuxidc.com/Linux/2013-03/81897.htm
正規表示式之零寬斷言 http://www.linuxidc.com/Linux/2013-03/81897.htm
Linux命令-檔案文字操作grep http://www.linuxidc.com/Linux/2015-12/126259.htm
grep正規表示式 http://www.linuxidc.com/Linux/2015-09/123035.htm
Linux中正規表示式與檔案格式化處理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-10/136250.htm
相關文章