如何在 Linux/macOS 中使用 grep 命令
全局正則表達(dá)式打?。╣rep)是一個(gè)強(qiáng)大的工具,可以在文本文件或標(biāo)準(zhǔn)輸入中搜索匹配正則表達(dá)式的行,并將結(jié)果打印到標(biāo)準(zhǔn)輸出。正則表達(dá)式(regex)是一種特殊的字符序列,可以幫助你有效地匹配文本或文件中的字符串。
在UNIX/Linux中,grep命令通常與正則表達(dá)式一起使用,以在文件中查找匹配的行。grep命令的一般語法如下:
grep [options] pattern [file...]
其中,pattern是要匹配的正則表達(dá)式模式,file是要搜索的文件名或文件路徑。可以省略file參數(shù),此時(shí)grep將從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)。
grep命令將輸出所有匹配的行,以及行中的匹配部分會(huì)被高亮顯示??梢允褂貌煌倪x項(xiàng)來控制grep的行為,例如使用-i選項(xiàng)進(jìn)行忽略大小寫的匹配,使用-r選項(xiàng)進(jìn)行遞歸搜索等。
基本正則表達(dá)式字符支持以下內(nèi)容:
擴(kuò)展正則表達(dá)式支持基本正則表達(dá)式和一些附加字符:
若要跳過這些字符中的任何一個(gè)并將其視為字符串文本,請(qǐng)?jiān)谒鼈兦懊娣胖靡粋€(gè)反斜杠。例如,如果不希望將 視為正則表達(dá)式字符,而僅將其視為問號(hào),請(qǐng)使用 。這適用于所有正則表達(dá)式。?\?
Grep 默認(rèn)支持基本正則表達(dá)式和帶有選項(xiàng)的擴(kuò)展正則表達(dá)式。如果您愿意,可以單獨(dú)使用 ,稱為:-Egrep -Eegrep
在本教程中,您將學(xué)習(xí)如何將 grep 與字符串、基本正則表達(dá)式和擴(kuò)展正則表達(dá)式一起使用。
grep語法
grep [options] 'expression' text
[選項(xiàng)] 例如或 –,我們將在稍后探索它們。
表達(dá)式表示搜索模式,該模式可以是字符串文本或正則表達(dá)式。
文本表示標(biāo)準(zhǔn)輸入,可以是文件、多個(gè)文件或其他命令的輸出。
我在一個(gè)名為 movies 的文件中準(zhǔn)備了電影列表.txt我們將使用此文本文件作為 grep 的輸入,并在此文件中搜索特定的搜索模式。
Top movies of all time:
The Shawshank Redemption (1994) - 9.2
The Godfather (1972) - 9.2
The Dark Knight (2008) - 9.0
the godfather part II (1974) - 9.0
Angry Men (1957) - 8.9
City of God (2002) - 8.6
基本搜索
看看《教父》是否在電影中.txt:
grep 'Godfather' movies.txt
輸出:
Grep 返回包含搜索詞“教父”的行。
將 grep 與正則表達(dá)式一起使用
示例 1:搜索前面有“The”的影片。
grep '^The' movies.txt
輸出:
眾所周知,正則表達(dá)式中的符號(hào)與以前面字符開頭的行匹配。
示例 2:搜索 2000 年之后發(fā)行的電影:
grep '20[0-9][0-9]' movies.txt
輸出:
2000 年之后的電影可以表示為 20xx,每個(gè) x 是 0 到 9 之間的任意數(shù)字,因此在表達(dá)式中替換為 [0-9]。
什么是 egrep?
如前所述,是另一個(gè)允許使用擴(kuò)展正則表達(dá)式的命令。讓我們看一個(gè)例子:查找?guī)в小敖谈浮被颉昂诎怠币辉~的電影
我們知道擴(kuò)展正則表達(dá)式中的 OR 由 表示:
grep -E 'Godfather|Dark' movies.txt
輸出:
如果我們單獨(dú)使用 grep(沒有 -E 選項(xiàng)),上面的命令不會(huì)返回任何內(nèi)容,因?yàn)樗鼘⒎?hào)視為文字而不是特殊字符。|
此外,上述命令等效于以下命令:
egrep 'Godfather|Dark' movies.txt
忽略區(qū)分大小寫
如果你注意到在電影.txt文件中,我們也有帶有小寫字母的電影“教父第二部分”,但我們使用搜索詞“教父”的搜索都沒有返回這一行。這是因?yàn)?grep 區(qū)分大小寫,我們可以使用選項(xiàng)忽略區(qū)分大小寫:
grep -i 'Godfather' movies.txt
輸出:
我們可以看到,無論大小寫如何,都返回了帶有“教父”一詞的兩行。
搜索完整單詞
讓我們看看如果我們搜索“上帝”這個(gè)詞會(huì)發(fā)生什么:
grep 'God' movies.txt
輸出:
兩部關(guān)鍵詞為“教父”和“上帝”的電影都是匹配的。這是因?yàn)閮蓚€(gè)關(guān)鍵字都有字母“上帝”。
要只匹配“上帝”(完整單詞),您可以使用 -w 選項(xiàng):
grep -w 'God' movies.txt
輸出:
僅返回匹配的單詞
我們可以使用選項(xiàng)只返回搜索的單詞,而不是整行。
grep -o 'Godfather' movies.txt
輸出:
反向搜索
反轉(zhuǎn)搜索返回除“表達(dá)式”之外的所有內(nèi)容。這與正常搜索相反。
例如,讓我們返回所有沒有“上帝”一詞的電影:
grep -v 'God' movies.txt
輸出:
我們可以看到所有沒有“上帝”一詞的電影。然而,我們?nèi)匀辉谀抢锟吹健敖谈浮薄_@是因?yàn)槲覀冊(cè)谒阉髟~中沒有忽略區(qū)分大小寫。我們可以將 -i 選項(xiàng)與 -v 結(jié)合使用,如下所示:
grep -iv 'God' movies.txt
輸出:
返回帶有行號(hào)的結(jié)果
如果要編輯與“表達(dá)式”匹配的行,查找行號(hào)可能非常有用,為此,請(qǐng)使用 -n 選項(xiàng):
grep -n 'Angry Men' movies.txt
輸出:
我們有它?!皯嵟娜恕币辉~出現(xiàn)在第 7 行。
我們可以使用像 vim 這樣的編輯器來編輯該特定行:
vim +7 movies.txt
它將直接帶您到第 7 行。
計(jì)算匹配字?jǐn)?shù)
如果我們想知道有多少電影有“上帝”這個(gè)詞,我們可以使用 -c 選項(xiàng):
grep -c 'God' movies.txt
輸出:
同樣,我們可以結(jié)合選項(xiàng)來了解有多少電影的標(biāo)題中有“上帝”或“上帝”。
grep -ic 'god' movies.txt
輸出:
返回完全匹配(全行)
要了解搜索詞(表達(dá)式)是否與行匹配,請(qǐng)使用 -x 選項(xiàng):
grep -x 'City of God (2002) - 8.6' movies.txt
僅當(dāng)整行與搜索的詞匹配時(shí),它才會(huì)匹配:
返回具有搜索詞的文件名
要查看哪些文件具有我們的搜索詞(表達(dá)式),我們使用 -l 選項(xiàng)。我們可以將多個(gè)文件名傳遞給它或使用星號(hào) (*):
grep -l 'Godfather' movies.txt grep.sh
或:
grep -l 'Godfather' ./*
在這里,我們告訴 grep 在當(dāng)前目錄中的任何文件中查找“教父”。
輸出:
./grep.sh
./movies.txt
單獨(dú)使用 option 只會(huì)搜索當(dāng)前目錄,如果當(dāng)前目錄中有子目錄,grep 不會(huì)搜索它們并拋出錯(cuò)誤。那是因?yàn)?grep 需要一個(gè)文件。為了克服這個(gè)問題,我們將遞歸查找任何文件的選項(xiàng)結(jié)合起來。
grep -lr 'Godfather' ./grep
點(diǎn) (.) 表示 Linux 中的當(dāng)前目錄。
輸出:
返回文件名和匹配的行
這就像具有額外功能的選項(xiàng)一樣,可以返回文件中匹配行的外觀。-l
我們使用 -H 選項(xiàng):
grep -Hr 'Godfather' ./grep
輸出:
如您所見,-H 選項(xiàng)返回文件名以及匹配的行,用冒號(hào) (:) 分隔。
比賽結(jié)束后返回其他行
有時(shí)我們想知道匹配行之后有哪些行。我們可以像下面這樣使用 -A 選項(xiàng)。
要在匹配行之后打印另外 2 行:
grep -A2 'Dark Knight' movies.txt
輸出:
因此,我們不僅有與表達(dá)式“黑暗騎士”匹配的行,而且我們還有后面的 2 行。
賽前返回線
這就像 -A 選項(xiàng),但它在相反的方向上工作。我們使用 -B(之前)來實(shí)現(xiàn)這一點(diǎn)。
要在具有匹配表達(dá)式“黑暗騎士”的行之前獲取 2 行:
grep -B2 'Dark Knight' movies.txt
輸出:
賽前和賽后的回程線
這結(jié)合了 -A 和 -B 選項(xiàng)。我們使用 -C 來實(shí)現(xiàn)這一點(diǎn)。
要返回帶有術(shù)語“黑暗騎士”的行之前的 2 行和之后的 2 行:
grep -C2 'Dark Knight' movies.txt
輸出:
使用 grep 搜索其他命令的輸出
我們可以使用 Linux 管道將任何命令的輸出作為標(biāo)準(zhǔn)輸入傳遞給 grep,并以與搜索文件相同的方式搜索它。
例如,讓我們搜索命令的輸出。
僅列出目錄:
ls -l | grep '^d'
從正則表達(dá)式中,我們知道這意味著匹配輸出中以字母“d”開頭的任何行,這意味著 Linux 中的目錄。
輸出:
grep 是 UNIX 系統(tǒng)中一個(gè)非常強(qiáng)大和有用的命令,如果使用得當(dāng),可以節(jié)省我們寶貴的時(shí)間。使用正則表達(dá)式可以非常有效和高效地搜索文件、多個(gè)文件、目錄中的文本模式和其他命令的輸出。在本教程中,我們解釋了如何將 grep 與正則表達(dá)式一起使用,并演示了一些最有用的 grep 選項(xiàng)。