CodeGym /Adesua ahorow /Docker SELF /使用 `grep` 搜尋文本

使用 `grep` 搜尋文本

Docker SELF
等級 8 , 課堂 0
開放

使用 grep 搜尋文本

1. 什麼是 grep

grep 是一個強大的命令列工具,用來在文本文件中根據指定的樣式搜索匹配的行。把 grep 想像成 Linux 世界中的「偵探」:它在「案件」(文件)中找到「線索」(文字樣式),並告訴你它們在哪裡。

grep 的名字來源於文字編輯器 ed 中的一個命令: g/re/p,意思是「全域正則表示式搜索並顯示結果」。

grep 用途廣泛:從在日誌中找錯誤,到分析系統數據。它完全不挑剔,能處理任何文字——不論是你的日記還是伺服器的日誌。


2. 基本語法

命令結構:

grep [選項] "範本" 檔案
  • [選項] — 指令的其他設定。
  • "範本" — 要搜索的文本或正規表達式。
  • 檔案 — 搜索時指定的檔名或多個檔案。

如果你想在多個檔案中搜索文本,可以簡單地用空格分隔列出它們,或者使用 *? 符號來處理檔案群組。

範例:

grep "error" /var/log/syslog

3. 更方便搜尋的選項

1. -i: 忽略大小寫

這個選項允許你搜尋文字時不管大小寫。例如,ErrorERRORerror 都會同時被找到。

使用範例:

grep -i "error" application.log

2. -v: 反向搜尋

With great power comes great responsibility... 有時候我們需要找到所有符合模式的內容。例如,排除含有 "debug" 的行。

使用範例:

grep -v "debug" system.log

3. -n: 以行號顯示結果

當檔案有很多行時,知道匹配的行在哪裡會很有用。-n 旗標會為每個找到的行添加行號。

使用範例:

grep -n "error" server.log

4. -r-R: 遞迴搜尋

你可以不僅在當前目錄,也能在它的所有子目錄中搜尋文字模式。若目錄下有成千上萬個檔案時要小心點喔!

使用範例:

grep -r "keyword" /home/user/documents

4. 使用範例

1. 查找精確匹配

在檔案 example.txt 中查找單詞 "hello":

grep "hello" example.txt

2. 查找字符串片段

試著查找包含用戶名的行,比如 "John":

grep "John" database.txt

3. 區分大小寫的查找

精確查找 "ERROR",不混淆 "error" 或 "Error":

grep "ERROR" log.txt

4. 遞歸式查找目錄

在當前目錄及其子目錄的所有文件中查找包含消息 "fatal error" 的行:

grep -r "fatal error" .

5. 反向查找

輸出所有包含單詞 "error" 的行:

grep -v "error" server.log

6. 只顯示前 10 個匹配結果

如果日誌太長,你可以限制顯示前 N 條消息:

grep "error" log.txt | head -n 10

7. 計算錯誤行數

可以簡單地計算包含錯誤的行數,提前準備心理狀態:

grep -c "error" log.txt

8. 使用過濾器

如果日誌中有很多沒有用的文字內容,可以使用過濾器。例如,下面我們在日誌中查找與內存相關的錯誤:

cat /var/log/syslog | grep "memory"

5. 結合 grep 與其他命令

在 Linux 中,命令常常一起工作(抱歉有點嘮叨)。利用管道符 |,我們可以將 grep 與其他工具結合使用。來看看幾個實際的範例吧!

1. 篩選系統訊息

想要僅查看 USB 設備的錯誤訊息嗎?簡單!

dmesg | grep "usb"

這裡我們將 dmesg(查看系統訊息命令)的輸出傳遞給 grep

2. 使用篩選器

如果日誌中有很多文本垃圾,可以使用篩選器。例如,以下是我們在日誌中搜索與記憶體相關的錯誤:

cat /var/log/syslog | grep "memory"

3. 搜索進程

列出所有與 nginx 相關的活動進程:

ps aux | grep "nginx"

6. 進階功能:正規表達式

如果簡單的搜尋不夠用,grep 支援一個超強的工具 - 正規表達式。試著不要被嚇到,沒你想像的那麼複雜啦!

正規表達式範例

搜尋以 "error" 開頭的行:

grep "^error" logfile.txt

解釋:

  • 符號 ^ 表示 "行的開頭"。

搜尋以 ".conf" 結尾的行:

grep "\.conf$" filelist.txt

解釋:

  • 符號 $ 表示行的結尾。
  • 反斜線 \ 讓符號 . 被識別為點,而不是任意字符。
重要!

正規表達式是一個非常強大的工具。有時候甚至過於強大。老笑話: 如果你有一個問題並且想用正規表達式來解決,那麼你現在有兩個問題了。


7. 實作任務

為了加強學習,請完成以下任務:

  1. 在檔案 access.log 中找到包含伺服器回應碼 "404" 的行:

    grep "404" access.log
    
  2. 在目錄 /var/log 中,找到所有包含單字 "error" 的行,忽略大小寫:

    grep -ri "error" /var/log
    
  3. 列出檔案 database.log包含單字 "DEBUG" 的行:

    grep -v "DEBUG" database.log
    
  4. 在系統日誌中找到包含日期 "Oct 15" 的行:

    grep "Oct 15" /var/log/syslog
    
  5. 從檔案 application.log 中輸出包含 "timeout" 的行,並顯示行號:

    grep -n "timeout" application.log
    

8. 常見錯誤和特殊情況

  1. 如果什麼都沒有顯示,這不一定是錯誤。可能只是沒有匹配的內容。試著用像 cat 這樣的指令檢查檔案,確保裡面有文字。

  2. 注意引號。如果 pattern 包含空格或者特殊字符,務必把它放在引號裡。

  3. 當你處理大型目錄並使用 -r 參數時,準備好面對大量輸出。用 | less 讓查看變得更方便。比如:

    grep -r "test" /some/directory | less
    

現在你已完全掌握了 grep 的用法,可以去搜尋任何東西,無論在哪裡了。從排查龐大程式碼庫中的漏洞,到分析系統日誌,你的搜尋技能將成為你最愛的工具之一。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION