Linux 中的 grep 指令及範例

grep 指令是 Linux 中使用最廣泛的工具之一,主要用於搜尋和過濾檔案中的文字。它代表“全域正規表示式列印”,其優勢在於能夠使用稱為正則表達式的模式有效地搜尋大量文字。無論您是搜尋特定字串、過濾日誌,還是執行複雜的文字處理任務,grep 都是 Linux 使用者不可或缺的工具。本指南將透過實際範例示範如何使用 grep 指令,幫助您掌握其在各種任務中的用法。

了解 grep 指令的不同選項

grep 指令不帶任何選項

grep 指令最簡單的形式如下:

grep 'pattern' file

該命令將在文件中搜尋包含該模式的行並將其列印到標準輸出。

帶選項的 grep 命令

可以使用各種選項 grep 命令來修改其功能。一些常用的有:

  • -i :使搜尋不區分大小寫。
  • -v :反轉搜索,列印與模式不符的行。
  • -r 或者 -R :透過目錄執行遞歸搜尋。
  • -l :返回找到模式的檔案名稱而不是行。
  • -n :顯示輸出行的行號。

選項的用法範例:

grep -i 'pattern' file

此命令將對檔案中的模式執行不區分大小寫的搜尋。

列出與模式相符的行

grep 的主要用途是列印與特定模式相符的行。例如:

grep 'hello' file.txt

這將列印 file.txt 中包含單字「hello」的所有行。

列出與模式不符的行

使用 -v 選項,我們可以列印與模式不符的行:

grep -v 'hello' file.txt

此命令將列印 file.txt 中不包含單字「hello」的所有行。

不區分大小寫的搜索

-i 選項允許不區分大小寫的搜尋:

grep -i 'hello' file.txt

此命令將列印 file.txt 中包含「hello」的所有行,無論大小寫。

跨多個文件搜索

grep 指令還可以搜尋多個檔案:

grep 'hello' file1.txt file2.txt

此命令將從 file1.txt 和 file2.txt 列印包含「hello」的行。

grep 指令的高階用法

透過 grep 指令使用正規表示式

grep 指令可以利用強大的正規表示式來搭配複雜的模式。例如:

grep '^hello' file.txt

此命令將列印 file.txt 中以「hello」開頭的行。

將 grep 命令與管道和其他命令結合使用

grep 指令可以透過管道與其他指令結合起來執行更複雜的操作。例如,您可以列出目錄中的所有檔案並根據模式過濾它們:

ls | grep '.txt'

此命令將列出目前目錄中名稱中包含「.txt」的所有檔案。

常見 grep 指令範例

範例 1:基本模式搜尋

文件中模式的基本搜尋:

grep 'hello' file.txt

這將列印 file.txt 中包含“hello”的所有行。

範例 2:不區分大小寫的搜尋

不區分大小寫的模式搜尋:

grep -i 'hello' file.txt

此命令將列印包含“hello”的行,無論大小寫。

範例 3:反向模式搜尋

搜尋不包含模式的行:

grep -v 'hello' file.txt

此命令將列印不包含“hello”的行。

範例 4:帶有輸出線的行號

使用輸出行列印行號:

grep -n 'hello' file.txt

此命令將列印包含“hello”的行及其行號。

範例 5:遞歸搜尋

對模式執行遞歸搜尋:

grep -r 'hello' /home/user/

此指令將在 /home/user/ 目錄和子目錄中遞歸搜尋「hello」。

範例 6:帶有輸出行的檔案名

列印檔案名稱以及輸出行:

grep -l 'hello' *

此命令將列印目前目錄中包含單字“hello”的檔案的名稱。

範例 7:計算模式的出現次數

計算包含特定模式的行數:

grep -c 'hello' file.txt

此命令將計算並顯示 file.txt 中包含「hello」的行數。

範例 8:正規表示式搜尋

搜尋以特定模式開頭的行:

grep '^hello' file.txt

此命令將列印 file.txt 中以「hello」開頭的行。

範例 9:顯示匹配前後的字符

顯示匹配前後一定數量的字元:

grep -o -P '.{0,10}hello.{0,10}' file.txt

此命令將列印模式「hello」之前的 10 個字元和之後的 10 個字元。

範例 10:在壓縮檔案中搜尋

在沒有明確解壓縮的壓縮檔案中搜尋:

zgrep 'hello' file.txt.gz

該命令將在壓縮檔案 file.txt.gz 中搜尋「hello」。

範例 11:僅顯示符合的模式

僅顯示匹配的模式:

grep -o 'hello' file.txt

此命令將僅列印 file.txt 中的單字“hello”,忽略該行的其餘部分。

範例 12:在遞歸搜尋中排除目錄

在遞歸搜尋期間排除特定目錄:

grep --exclude-dir={dir1,dir2} -r 'hello' .

此指令在目前目錄中遞歸搜尋“hello”,不包括 dir1 和 dir2。

範例 13:使用擴展正規表示式

使用擴展正規表示式進行複雜模式比對:

grep -E 'hello|world' file.txt

此命令將列印 file.txt 中包含“hello”或“world”的行。

範例 14:僅匹配整個單字

僅匹配整個單字,不包括部分單字匹配:

grep -w 'hello' file.txt

此命令將列印 file.txt 中包含整個單字「hello」的行。

範例 15:在遞歸搜尋中排除文件

在遞歸搜尋期間排除特定文件:

grep --exclude={file1,file2} -r 'hello' .

該指令將在目前目錄中遞歸搜尋“hello”,不包括file1和file2。

高級 grep 命令範例

範例 1:將 grep 與其他指令結合使用

當與其他指令結合使用時,grep 的功能可以進一步增強。例如,要計算 Web 伺服器的活動連線數,我們可以使用 grep 和 netstat:

netstat -an | grep ':80' | grep 'ESTABLISHED' | wc -l

此命令將列印伺服器上連接埠 80 的活動連線數。

範例 2:將 grep 與正規表示式結合使用

要搜尋以特定模式結尾的行,我們可以使用 grep 和正規表示式:

grep 'world$' file.txt

此命令將列印 file.txt 中以「world」結尾的行。

範例 3:將 grep 與正規表示式結合使用以實現多種模式

對於涉及多個模式的更複雜的模式匹配,我們可以使用 grep 和擴展正規表示式:

grep -E '^(error|warning):' file.txt

此命令將列印 file.txt 中以「錯誤:」或「警告:」開頭的行。

範例 4:在 Bash 腳本中使用 grep

grep 指令可以在 bash 腳本中使用,根據是否找到模式來執行操作。例如:

if grep -q 'error' file.txt; then
    echo 'Error found!'
else
    echo 'No errors found.'
fi

該腳本將列印“發現錯誤!”如果在 file.txt 中找到「錯誤」一詞且「未發現錯誤」。如果不是的話。

範例 5:使用 grep 在二進位檔案中搜尋模式

儘管 grep 通常用於文字搜索,但它也可以搜尋二進位檔案中的模式:

grep -a 'hello' binaryfile

此命令將在二進位檔案中搜尋字串“hello”,並將其視為文字。

結論

掌握 grep 命令可以顯著增強您在 Linux 中搜尋、過濾和操作文字檔案的能力。無論您是對系統日誌進行故障排除、搜尋程式碼中的特定模式,還是過濾其他命令的輸出,grep 都提供了靈活且強大的解決方案。定期練習該命令並探索其眾多選項和標誌將使其成為 Linux 工具包的寶貴組成部分。

Joshua James
跟我來
Joshua James 的最新帖子 (看全部)

發佈留言