在 Linux 中怎樣進(jìn)行 grep 搜索呢?通過例子來學(xué)習(xí)幾個常用的方法
grep 是一個功能強(qiáng)大的 unix 命令,可以在文件內(nèi)容中搜索各種參數(shù)。在各種故障排除或調(diào)試中特別有用。
grep 有很多選項(xiàng)和使用場景,你應(yīng)該不會全部都用得到,不過,其中有幾個 grep 命令還是經(jīng)常會用到的。
本文會舉例說明一些最常見的 grep 命令,介紹其常見選項(xiàng)及用法。
如下表列出了一些常見的選項(xiàng)及其說明:
選項(xiàng) | 例子 | 說明 |
i | grep -i pattern file | 不區(qū)分大小寫的搜索 |
A | grep -A n pattern file | 顯示搜索的后幾行 |
B | grep -B n pattern file | 顯示搜索的前幾行 |
C | grep -C n pattern file | 顯示搜索的前幾行和后幾行 |
v | grep -v pattern file | 顯示不匹配的行 |
c | grep -c pattern file | 計(jì)算匹配的行數(shù) |
l | grep -l pattern file | 只顯示搜索到的文件名稱 |
w | grep -w pattern file | 全字匹配 |
e | grep -e regex file | 匹配正則表達(dá)式 |
a | grep -a pattern file | 在二進(jìn)制文件中搜索 |
r | grep -r pattern dir | 遞歸搜索目錄 |
grep 命令實(shí)例
你可能已經(jīng)知道,要搜索文件中特定的文本或表達(dá)式,可以這樣使用grep:
grep search_pattern filename
現(xiàn)在我們看看幾個常見的例子
不區(qū)分大小寫的搜索
默認(rèn)情況下,grep 是區(qū)分大小寫的。你可以使用 -i 選項(xiàng)來讓其不區(qū)分大小寫:
grep -i search_pattern filename
顯示匹配文本的前后行
默認(rèn)情況下,你只會看到匹配文本的當(dāng)前行。但是,當(dāng)你在排除故障的時候,看一下匹配行的前一行,或者后一行,也會有幫助。
你可以使用 -A 來顯示匹配行之后的行。記住,A代表之后(After)。
下面的命令將顯示匹配的行以及匹配后的5行:
grep -A 5 search_pattern filename
類似地,你可以使用 -B 選項(xiàng)在匹配的行之前顯示行。記住,B代表之前(Before)。
下面的命令將在匹配行之前顯示5行以及匹配行:
grep -B 5 search_pattern filename
我最喜歡的是選項(xiàng) -C,因?yàn)樗@示了匹配行之前和之后的行。C 代表圓(Circle)。
下面的命令將顯示匹配行之前的5行、匹配行和匹配行之后的5行:
grep -C 5 search_pattern filename
顯示不匹配的行
你可以使用 grep 顯示與給定表達(dá)式不匹配的所有行。此“反向匹配”使用 -v 選項(xiàng):
grep -v search_pattern filename
你可以將 -i 和 -v 一起使用。
計(jì)算匹配行的數(shù)量
使用 -c 選項(xiàng),可以不顯示匹配的行,只顯示與給定表達(dá)式匹配的行的數(shù)量。注意,這里的 c 是小寫的 c。
grep -c search_pattern filename
你可以將 -c 和 -v 選項(xiàng)一起用來查看與給定表達(dá)式不匹配的行數(shù)。當(dāng)然,也可以結(jié)合使用不區(qū)分大小寫的 -i 選項(xiàng)。
顯示匹配行的行號
要顯示匹配行的行號,可以使用 -n 選項(xiàng)。
grep -n search_pattern filename
顯示行號也可以使用 -v 來進(jìn)行反向搜索。
在多個文件中搜索
可以給出多個文件進(jìn)行 grep 搜索:
grep search_pattern file1 file2
這樣搜索是可以的。但平時更實(shí)用也更常用的,是搜索特定類型的文件,比如只搜索shell腳本(以 .sh 結(jié)尾的文件),可以這樣使用 grep 命令:
grep search_pattern *.sh
遞歸搜索目錄中的所有文件
你可以使用 -r 選項(xiàng)執(zhí)行遞歸搜索,它會在當(dāng)前目錄以及子目錄的所有文件中搜索給定的表達(dá)式:
grep -r search_pattern directory_path
僅顯示文件名
默認(rèn)情況下,grep 顯示匹配的行。如果你已經(jīng)在多個文件上運(yùn)行了搜索,并且只想查看哪些文件包含字符串,那么可以使用 -l 選項(xiàng)。
grep -l search_pattern files_pattern
比如你要在所有.md文件中搜索單詞 "handbook",可以這樣:
grep -l handbook *.md
全字符匹配(搜索完整單詞)
默認(rèn)情況下,grep 將顯示包含給定字符串的任何行。你可能并不總是想要這樣,比如你正在搜索“done”一詞,它的結(jié)果還會顯示包含“doner”或“abandoned”的行。
要使用全字符匹配 ,可以使用 -w 選項(xiàng):
grep -w search_string file
這樣,搜索單詞 "done" 的時候,就只顯示包含 "done" 的行,而不會顯示包含 "doner" 或 "abandoned" 的行。
按正則表達(dá)式搜索
你可以使用正則表達(dá)式來搜索,選項(xiàng) -e 可以允許使用正則表達(dá)式,另外一個選項(xiàng) -E 允許使用擴(kuò)展的正則表達(dá)式。
grep -e regex_pattern file
使用 "或運(yùn)算符" |
你可以在同一個 grep 搜索中使用多個表達(dá)式,如果要搜索包含“表達(dá)式1”,或者“表達(dá)式2”的行,可以使用“或(OR)" 運(yùn)算符 |,但是需要添加反斜線進(jìn)行轉(zhuǎn)義:
grep 'pattern1\|pattern' filename
AND運(yùn)算符沒有特定選項(xiàng)。為此,你可以多次使用 grep 和管道重定向。
搜索二進(jìn)制文件
默認(rèn)情況下,grep 會忽略二進(jìn)制文件。你可以使用 -a 選項(xiàng)使其在二進(jìn)制文件中搜索,就像它是文本文件一樣:
grep -a pattern binary_file