在使用系統時,我們或多或少的有一些搜索、查找的需求,必須要在文本中搜索某個關鍵字,或者過濾出文本中某些特定的行。grep 命令就為我們提供了這樣一個功能,同時,grep 還可以使用正則表達式進行匹配,這是一個強大的功能,有必要好好掌握。
grep PATTERN [OPTIONS] FILE:在文件中按照模式進行查找。FILE 是我們要查找的目標文件,如果不指定目標文件,grep 將會從標准輸入中讀取輸入的內容,然後進行匹配。為了方便起見,本文的所有演示都在命令行中通過標准輸入進行。
如果沒有高亮顯示匹配到的內容,可以手動指定:grep --color PATTER 進行匹配,更可以使用命令別名,減少我們的輸入時間:alias grep="grep --color"。
正則表達式(Regular Expression 或 REGEXP)分為基礎正則表達式(Basic REGEXP)和擴展正則表達式(Extended REGEXP)。grep 默認采用基礎正則表達式,如需使用擴展正則表達式需要附加選項。
由於介紹正則表達式實在太過復雜,我想了很久也無法很好的組織語言,因此這裡就不再對正則中的元字符進行一一的介紹了。需要了解這方面的同學,可以去看一下三十分鐘入門正則表達式系列的教程,應該很快就能學會。
"[]" 表示匹配 [] 中出現的任意一個字符,[a-zA-Z] 表示匹配所有的英文字母。
"[^]" 表示匹配出去 [] 中出現的字符之外的任意字符。
在正則表達式中,'*' 號不再表示任意字符,而表示其前的字符可以出現任意次。有時候我們在命令中使用 '*' 進行通配符匹配文件,要注意它在正則表達式中的不同用法。在正則表示中使用 '.' 點號來匹配任意字符。
在正則中,'.' 點號表示不為空的任意字符。
".*" 表示匹配出現任意次數的任意字符。正則表達式默認處於貪婪模式,因此在第一次匹配到結果後,還會進行多次匹配,知道沒有匹配為止。
"\?" 表示匹配前面的字符出現 0 次 或者 1 次,注意這個問號需要被轉義。
"\{m,n\}" 表示前面的字符出現最少 m 次,最大 n 次。"\{m,\}" 表示前面的字符至少出現 m 次,"\{,n\}" 表示前面的字符至多出現 n 次。
'^' 和 '$' 是正則表達式中的兩個位置錨定。'^' 表示其後的字符必須出現在行首,而 '$' 表示其前的字符必須出現在行尾,"^$" 表示匹配空白字符。
"\<" 和 "\>" 用來錨定單詞,二者不一定要成對出現,也可以使用 "\b" 進行錨定。"\bWORD" (或者 "\<WORD\>") 表示匹配以 WORD 開頭的單詞,"WORD\b" 表示匹配以 WORD 結尾的單詞,"\bWORD\b" 表示完完全全匹配 WORD 單詞。
"\(\)" 表示對 PATTERN 進行分組,分組還支持後向引用,使用 "\1","\2" 等引用前面的分組。後向引用只匹配和前面相同的內容。
'|' 表示或,匹配其前或者其後的單詞,注意並不是匹配字符,如需匹配字符,需要使用分組進行限定。我這裡使用的是擴展正則,如需使用基本正則,需要將 '|' 換為 "\|"。
grep 同時還支持擴展正則表達式,在使用擴展正則表達式是,需要使用 -E 選項。基礎正則表達式和擴展正則表達式中的一些區別:
在基礎正則表達式中匹配 ?,(),{} ,不需要進行轉移,而在擴展正則表達式中則需要加上轉義符號 \。
擴展正則表達式中的其他選項:
在使用 grep 時,如果想要開啟擴展正則表達式,需要指定 -E 選項,而 egrep 命令則是默認支持擴展正則表達式。因此在需要使用擴展正則表達式時推薦使用 egrep 代替 grep -E。
fgrep 表示快速匹配,不支持正則表達式,沒有轉義的概念,會對 PATTERN 中的所有字符進行匹配。
本篇我們介紹了 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