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