grep — 在檔案中搜尋符合樣式的文字行
搜尋符合樣式的文字行,支援正規表示式。
語法
grep [選項] 樣式 [檔案...]
常用選項
| 選項 | 說明 | 範例 |
|---|---|---|
-i, --ignore-case |
不區分大小寫進行搜尋 | grep -i "error" log.txt |
-v, --invert-match |
只顯示不符合樣式的行(反向搜尋) | grep -v "^#" config.conf |
-r, --recursive |
遞迴搜尋目錄中的所有檔案 | grep -r "TODO" ./src/ |
-n, --line-number |
在輸出前顯示行號 | grep -n "def " main.py |
-l, --files-with-matches |
只顯示含有匹配行的檔案名稱 | grep -rl "class" ./src/ |
-c, --count |
只顯示每個檔案中符合行的數量 | grep -c "ERROR" app.log |
-E, --extended-regexp |
使用延伸正規表示式(ERE) | grep -E "cat|dog" |
-P, --perl-regexp |
使用 Perl 相容正規表示式(PCRE) | grep -P "\d{4}-\d{2}" |
-o, --only-matching |
只輸出符合的部分,而非整行 | grep -o "http[^ ]*" log |
-A n |
顯示匹配行後 n 行(After context) | grep -A 3 "ERROR" log |
-B n |
顯示匹配行前 n 行(Before context) | grep -B 2 "ERROR" log |
-C n |
顯示匹配行前後各 n 行(Context) | grep -C 2 "ERROR" log |
-w, --word-regexp |
只匹配完整單字(邊界匹配) | grep -w "log" file.txt |
-x, --line-regexp |
整行完全符合才算匹配 | grep -x "DONE" status.txt |
-q, --quiet |
靜默模式,不輸出,只用回傳碼表示結果 | grep -q "ok" file && echo found |
--color[=WHEN] |
高亮顯示匹配的部分 | grep --color=auto "error" log |
使用範例
範例 1:基本字串搜尋
在 /var/log/syslog 中找出含有「error」的行(區分大小寫)。
$ grep "error" /var/log/syslog
May 20 09:12:33 host kernel: [12345.678] error in module x
範例 2:不區分大小寫搜尋
使用 -i 可同時找到 Error、ERROR、error 等各種大小寫組合。
$ grep -i "error" /var/log/auth.log
May 20 08:00:01 host sshd[1234]: error: Could not load host key
範例 3:顯示行號
使用 -n 在每個匹配行前顯示行號,方便定位程式碼位置。
$ grep -n "def " main.py
15:def calculate_total(items):
42:def format_output(data):
78:def main():
範例 4:遞迴搜尋目錄
使用 -r 搜尋整個目錄樹,找出所有含 TODO 的檔案與行。
$ grep -rn "TODO" ./src/
./src/main.py:23:# TODO: 加入錯誤處理
./src/utils.py:67:# TODO: 優化這個函數
範例 5:反向搜尋(過濾行)
使用 -v 顯示不含 # 開頭的行,常用於過濾設定檔中的注釋行。
$ grep -v "^#" /etc/hosts
127.0.0.1 localhost
::1 localhost
192.168.1.10 server1
範例 6:管線過濾(最常用情境)
搭配其他指令的輸出使用,過濾出含有 LISTEN 的網路連接。
$ ss -tuln | grep LISTEN
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
範例 7:顯示匹配行的上下文
使用 -C 3 顯示匹配行前後各 3 行,方便瞭解錯誤的完整脈絡。
$ grep -C 3 "CRITICAL" /var/log/app.log
2026-05-20 09:12:28 INFO Starting job #4521
2026-05-20 09:12:29 INFO Processing 1024 records
2026-05-20 09:12:30 WARNING disk space low
2026-05-20 09:12:31 CRITICAL disk full, aborting
2026-05-20 09:12:31 ERROR Job #4521 failed
範例 8:使用延伸正規表示式
使用 -E(或 egrep)可用 | 表示「或」等延伸語法。
$ grep -E "(ERROR|WARN|CRITICAL)" app.log
2026-05-20 09:00:01 WARN Memory usage high
2026-05-20 09:12:31 CRITICAL disk full
範例 9:只顯示匹配的部分
使用 -o 只輸出符合正規表示式的部分,適合提取 IP、URL 等特定資料。
$ grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -5
352 192.168.1.105
241 10.0.0.23
189 203.0.113.42
常見錯誤與排錯
grep: warning: GREP_OPTIONS is deprecated
- 原因
- 舊版的 GREP_OPTIONS 環境變數已廢棄。
- 解法
- 在 ~/.bashrc 中改用 alias grep="grep --color=auto" 等方式設定預設選項。
grep: invalid option -- 'P'
- 原因
- 某些精簡版 grep(如 BusyBox)不支援 -P(PCRE)。
- 解法
- 改用 -E(延伸正規表示式)或安裝完整版 grep(apt install grep)。
Binary file /path/to/file matches
- 原因
- 匹配到二進位檔案時 grep 會顯示此訊息而非內容。
- 解法
- 加上 -a 將檔案視為文字,或 --include="*.txt" 限制搜尋範圍。