如何在 Linux 上使用 grep 命令

已發表: 2022-01-29
Linux PC 上的終端​​提示符。
Fatmawati Achmad Zaenuri/Shutterstock

Linux grep命令是一個字符串和模式匹配實用程序,它顯示來自多個文件的匹配行。 它也適用於其他命令的管道輸出。 我們向您展示如何。

grep 背後的故事

grep命令在 Linux 和 Unix 圈子中很有名,原因有三個。 首先,它非常有用。 其次,豐富的選擇可能是壓倒性的。 第三,它是為了滿足特殊需要而在一夜之間編寫的。 前兩個很受歡迎; 第三個稍微偏離。

Ken Thompson 從ed編輯器(發音為 ee-dee)中提取了正則表達式搜索功能,並創建了一個小程序——供他自己使用——來搜索文本文件。 他在貝爾實驗室的部門負責人 Doug Mcilroy 找到 Thompson 並描述了他的一位同事 Lee McMahon 面臨的問題。

10 個適合初學者的基本 Linux 命令
相關10 個適合初學者的基本 Linux 命令

麥克馬洪試圖通過文本分析來確定聯邦黨人論文的作者。 他需要一個可以在文本文件中搜索短語和字符串的工具。 Thompson 那天晚上花了大約一個小時使他的工具成為其他人可以使用的通用實用程序,並將其重命名為grep 。 他從ed命令字符串g/re/p中取名,翻譯為“全局正則表達式搜索”。

您可以觀看 Thompson 與 Brian Kernighan 談論grep的誕生。

使用 grep 進行簡單搜索

要在文件中搜索字符串,請在命令行中傳遞搜索詞和文件名:

終端窗口中的 grep dave /etc/password
廣告

顯示匹配的行。 在這種情況下,它是單行。 匹配的文本被突出顯示。 這是因為在大多數發行版中grep被別名為:

 別名 grep='grep --color=auto'

讓我們看看有多行匹配的結果。 我們將在應用程序日誌文件中查找“Average”一詞。 因為我們無法回憶日誌文件中單詞是否為小寫,所以我們將使用-i (忽略大小寫)選項:

 grep -i 平均 geek-1.log 

顯示每個匹配的行,每個匹配的文本都突出顯示。

我們可以使用 -v(反轉匹配)選項來顯示不匹配的行。

 grep -v 內存 geek-1.log 

沒有突出顯示,因為這些是不匹配的行。

廣告

我們可以使grep完全靜默。 結果作為grep的返回值傳遞給 shell。 結果為零表示找到字符串,結果為一表示找到。 我們可以使用$? 特殊參數:

 grep -q 平均 geek-1.log
 迴聲$?
 grep -q howtogeek geek-1.log
 迴聲$? 

使用 grep 進行遞歸搜索

要搜索嵌套目錄和子目錄,請使用 -r(遞歸)選項。 請注意,您不要在命令行上提供文件名,而必須提供路徑。 這裡我們在當前目錄“.”中搜索。 和任何子目錄:

 grep -r -i memfree 。 

輸出包括每個匹配行的目錄和文件名。

我們可以使用-R (遞歸取消引用)選項使grep跟隨符號鏈接。 我們在這個目錄中有一個符號鏈接,稱為logs-folder 。 它指向/home/dave/logs

 ls -l 日誌文件夾

讓我們使用-R (遞歸取消引用)選項重複我們上次的搜索:

 grep -R -i memfree 。 

跟隨符號鏈接,並且它指向的目錄也由grep搜索。

搜索整個單詞

默認情況下,如果搜索目標出現在該行中的任何位置(包括另一個字符串中),則grep將匹配該行。 看看這個例子。 我們將搜索“免費”這個詞。

 grep -i 免費 geek-1.log 

廣告

結果是其中包含字符串“free”的行,但它們不是單獨的單詞。 它們是字符串“MemFree”的一部分。

要強制grep僅匹配單獨的“單詞”,請使用-w (單詞正則表達式)選項。

 grep -w -i 免費 geek-1.log
 迴聲$? 

這次沒有結果,因為搜索詞“free”沒有作為單獨的詞出現在文件中。

使用多個搜索詞

-E (擴展正則表達式)選項允許您搜索多個單詞。 ( -E選項替換不推薦使用的egrep版本的grep 。)

該命令搜索兩個搜索詞,“average”和“memfree”。

 grep -E -w -i "平均|memfree" geek-1.log 

廣告

為每個搜索詞顯示所有匹配行。

您還可以搜索多個不一定是完整單詞的術語,但它們也可以是完整單詞。

-e (模式)選項允許您在命令行上使用多個搜索詞。 我們正在使用正則表達式括號功能來創建搜索模式。 它告訴grep匹配括號“[]”中包含的任何一個字符。 這意味著grep在搜索時將匹配“kB”或“KB”。

兩個字符串都匹配,事實上,有些行包含兩個字符串。

精確匹配線

-x (行正則表達式)將僅匹配整行與搜索詞匹配的行。 讓我們搜索一個我們知道在日誌文件中只出現一次的日期和時間戳:

 grep -x "20-Jan--06 15:24:35" geek-1.log 

找到並顯示匹配的單行。

與此相反的是僅顯示匹配的行。 這在您查看配置文件時很有用。 評論很棒,但有時很難在其中找到實際設置。 這是/etc/sudoers文件:

廣告

我們可以像這樣有效地過濾掉註釋行:

 sudo grep -v "#" /etc/sudoers 

這更容易解析。

只顯示匹配的文本

有時您可能不想看到整個匹配行,而只想看到匹配的文本。 -o (僅匹配)選項就是這樣做的。

 grep -o MemFree geek-1.log 

顯示減少為僅顯示與搜索詞匹配的文本,而不是整個匹配行。

用 grep 計數

grep不僅僅是文本,它也可以提供數字信息。 我們可以用不同的方式為我們計算grep 。 如果我們想知道一個搜索詞在一個文件中出現了多少次,我們可以使用-c (count) 選項。

 grep -c 平均 geek-1.log 

grep報告該搜索詞在該文件中出現了 240 次。

您可以使用-n (行號)選項使grep顯示每個匹配行的行號。

 grep -n Jan geek-1.log 

廣告

每個匹配行的行號顯示在行首。

要減少顯示的結果數,請使用-m (最大計數)選項。 我們將輸出限制為五個匹配的行:

 grep -m5 -n Jan geek-1.log 

添加上下文

對於每條匹配的行,能夠看到一些額外的行(可能是不匹配的行)通常很有用。 它可以幫助區分哪些匹配行是您感興趣的行。

要在匹配行之後顯示一些行,請使用 -A(在上下文之後)選項。 在這個例子中,我們要求三行:

 grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log 

要查看匹配行之前的某些行,請使用-B (之前的上下文)選項。

 grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log 

並且要包含匹配行之前和之後的行,請使用-C (上下文)選項。

 grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log 

顯示匹配文件

要查看包含搜索詞的文件的名稱,請使用-l (匹配的文件)選項。 要找出哪些 C 源代碼文件包含對sl.h頭文件的引用,請使用以下命令:

 grep -l "sl.h" *.c 

列出了文件名,而不是匹配的行。

廣告

當然,我們可以查找不包含搜索詞的文件。 -L (不匹配的文件)選項就是這樣做的。

 grep -L "sl.h" *.c 

行的開始和結束

我們可以強制grep僅顯示位於行首或行尾的匹配項。 “^”正則表達式運算符匹配行首。 實際上,日誌文件中的所有行都包含空格,但我們將搜索以空格作為首字符的行:

 grep "^" geek-1.log 

將顯示以空格作為第一個字符的行(位於行首)。

要匹配行尾,請使用“$”正則表達式運算符。 我們將搜索以“00”結尾的行。

 grep "00$" geek-1.log 

顯示屏顯示以“00”作為最後字符的行。

通過 grep 使用管道

當然,您可以將輸入通過管道傳輸到grep ,將grep的輸出通過管道傳輸到另一個程序,並將grep置於管道鏈的中間。

廣告

假設我們想在 C 源代碼文件中查看所有出現的字符串“ExtractParameters”。 我們知道會有很多,所以我們將輸出傳遞到less

 grep "提取參數" *.c | 較少的

輸出以less表示。

這使您可以翻閱文件列表並使用less's搜索工具。

如果我們將grep的輸出通過管道傳輸到wc並使用-l (行)選項,我們可以計算源代碼文件中包含“ExtractParameters”的行數。 (我們可以使用grep -c (count) 選項來實現這一點,但這是演示grep管道的一種巧妙方法。)

 grep "提取參數" *.c | wc -l 

使用下一個命令,我們將ls的輸出傳送到grep並將 grep 的輸出grepsort 。 我們列出當前目錄中的文件,選擇其中帶有字符串“Aug”的文件,並按文件大小對它們進行排序:

 ls -l | grep "八月" | 排序 +4n 

讓我們分解一下:

  • ls -l :使用ls執行文件的長格式列表。
  • grep “Aug” :從ls列表中選擇其中包含“Aug”的行。 請注意,這也會找到名稱中包含“Aug”的文件。
  • sort +4n :對第四列(文件大小)上的 grep 輸出進行排序。

我們得到了 8 月份修改的所有文件的排序列表(不分年份),按文件大小升序排列。

相關:如何在 Linux 上使用管道

grep:少一點命令,多一點盟友

grep是一個非常棒的工具,供您使用。 它可以追溯到 1974 年,並且仍然很強大,因為我們需要它的功能,沒有什麼比它更好的了。

grep與一些正則表達式結合起來——fu 真的把它帶到了一個新的水平。

相關:如何使用基本正則表達式更好地搜索並節省時間

相關:適合開發人員和愛好者的最佳 Linux 筆記本電腦