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" 限制搜尋範圍。

延伸閱讀