使用 grep
搜尋文本
1. 什麼是 grep
?
grep
是一個強大的命令列工具,用來在文本文件中根據指定的樣式搜索匹配的行。把 grep
想像成 Linux 世界中的「偵探」:它在「案件」(文件)中找到「線索」(文字樣式),並告訴你它們在哪裡。
grep
的名字來源於文字編輯器 ed
中的一個命令: g/re/p
,意思是「全域正則表示式搜索並顯示結果」。
grep
用途廣泛:從在日誌中找錯誤,到分析系統數據。它完全不挑剔,能處理任何文字——不論是你的日記還是伺服器的日誌。
2. 基本語法
命令結構:
grep [選項] "範本" 檔案
- [選項] — 指令的其他設定。
- "範本" — 要搜索的文本或正規表達式。
- 檔案 — 搜索時指定的檔名或多個檔案。
如果你想在多個檔案中搜索文本,可以簡單地用空格分隔列出它們,或者使用 *
和 ?
符號來處理檔案群組。
範例:
grep "error" /var/log/syslog
3. 更方便搜尋的選項
1. -i
: 忽略大小寫
這個選項允許你搜尋文字時不管大小寫。例如,Error
、ERROR
和 error
都會同時被找到。
使用範例:
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. 實作任務
為了加強學習,請完成以下任務:
在檔案
access.log
中找到包含伺服器回應碼 "404" 的行:grep "404" access.log
在目錄
/var/log
中,找到所有包含單字 "error" 的行,忽略大小寫:grep -ri "error" /var/log
列出檔案
database.log
中不包含單字 "DEBUG" 的行:grep -v "DEBUG" database.log
在系統日誌中找到包含日期 "Oct 15" 的行:
grep "Oct 15" /var/log/syslog
從檔案
application.log
中輸出包含 "timeout" 的行,並顯示行號:grep -n "timeout" application.log
8. 常見錯誤和特殊情況
如果什麼都沒有顯示,這不一定是錯誤。可能只是沒有匹配的內容。試著用像
cat
這樣的指令檢查檔案,確保裡面有文字。注意引號。如果 pattern 包含空格或者特殊字符,務必把它放在引號裡。
當你處理大型目錄並使用
-r
參數時,準備好面對大量輸出。用| less
讓查看變得更方便。比如:grep -r "test" /some/directory | less
現在你已完全掌握了 grep
的用法,可以去搜尋任何東西,無論在哪裡了。從排查龐大程式碼庫中的漏洞,到分析系統日誌,你的搜尋技能將成為你最愛的工具之一。
GO TO FULL VERSION