grep 簡介
grep (Global Regular Expression Print) 是 Linux 核心文字搜尋工具,支援正則表達式,能快速從檔案或標準輸入中過濾符合模式的行。
基本語法
grep [選項] 模式 [檔案...]
grep [選項] -e 模式1 -e 模式2 [檔案...]
核心參數分類
輸出控制
| 參數 | 功能 |
-c, --count | 僅輸出匹配行數 |
-n, --line-number | 顯示行號 |
-h, --no-filename | 多檔搜尋時不顯示檔名 |
-l, --files-with-matches | 僅列出含匹配行的檔名 |
-o, --only-matching | 僅輸出匹配的部分 (非整行) |
-v, --invert-match | 反向匹配 (顯示不符合的行) |
-s, --no-messages | 抑制錯誤訊息 (如檔案不存在) |
--color=auto | 高亮顯示匹配部分 (預設終端機自動) |
模式匹配控制
| 參數 | 功能 |
-i, --ignore-case | 忽略大小寫 |
-w, --word-regexp | 整字匹配 |
-x, --line-regexp | 整行匹配 |
-E, --extended-regexp | 使用擴展正則 (ERE),等同 egrep |
-P, --perl-regexp | 使用 Perl 相容正則 (PCRE),功能最強 |
-F, --fixed-strings | 字面字串匹配 (不解析正則),等同 fgrep |
上下文控制
| 參數 | 功能 |
-A NUM, --after-context | 顯示匹配行後 NUM 行 |
-B NUM, --before-context | 顯示匹配行前 NUM 行 |
-C NUM, --context | 顯示匹配行前後各 NUM 行 |
正則表達式速查 (ERE/PCRE 常用)
| 元字元 | 說明 | 範例 |
. | 任意單一字元 | c.t 匹配 cat, cut, c3t |
^ | 行首 | ^root 以 root 開頭的行 |
$ | 行尾 | bash$ 以 bash 結尾的行 |
[abc] | 字元集合 (任一) | [aeiou] 任一母音 |
[^abc] | 排除字元集合 | [^0-9] 非數字 |
[a-z] | 字元範圍 | [A-Za-z] 英文字母 |
* | 前一元素 0 次或多次 | ab*c ac, abc, abbc... |
+ | 前一元素 1 次或多次 (ERE/PCRE) | ab+c abc, abbc... |
? | 前一元素 0 次或 1 次 (ERE/PCRE) | ab?c ac, abc |
{n} | 前一元素恰好 n 次 | o{2} oo |
{n,} | 前一元素至少 n 次 |
{n,m} | 前一元素 n 到 m 次 |
\| | 或 (ERE 需轉義,PCRE 可用 |) | cat\|dog |
() | 分組 (ERE 需轉義) | (ab)+ ababab |
\b | 單字邊界 (PCRE) | \bcat\b 整字 cat |
\d \w \s | 數字/單字字元/空白 (PCRE) | \d{3}-\d{4} 電話格式 |
實戰範例集
基礎搜尋
# 1. 搜尋含 "error" 的行 (含行號)
grep -n "error" app.log
# 2. 忽略大小寫
grep -ni "error" app.log
# 3. 反向匹配:排除含 "debug" 的行
grep -v "debug" app.log
# 4. 統計匹配行數
grep -c "ERROR" app.log
正則進階
# 5. 行首匹配:以 timestamp 開頭
grep "^2023-" syslog
# 6. 字元集合:找 t[a-c]b 模式
grep "t[abc]b" file.txt
# 7. 排除字元:oo 前非 g
grep "[^g]oo" file.txt
# 8. 範圍:含字母數字的行
grep "[a-zA-Z0-9]" file.txt
# 9. 空行 / 非空行
grep "^$" file.txt # 空行
grep -v "^$" file.txt # 非空行
# 10. 重複字元:連續兩個 o
grep -E "o{2}" file.txt # 或 grep "oo"
# 11. 整字匹配
grep -w "root" /etc/passwd
多檔與遞迴
# 12. 遞迴搜尋目錄
grep -r "pattern" /etc/
# 13. 僅搜尋 .conf 檔
grep -r "pattern" /etc/ --include="*.conf"
# 14. 排除目錄
grep -r "pattern" /var/log --exclude-dir="journal"
# 15. 只顯示檔名
grep -rl "TODO" src/
上下文與管線應用
# 16. 顯示匹配行前後 3 行
grep -C 3 "critical" app.log
# 17. 結合管線:找出含 error 的程序 PID
ps aux | grep -E "error|fail" | grep -v grep
# 18. 計算某 IP 存取次數 (nginx log)
grep -c "192.168.1.100" access.log
# 19. 只輸出匹配的 IP 部分 (PCRE)
grep -oP '\d{1,3}(\.\d{1,3}){3}' access.log | sort -u
效能提示
- 大檔案用
-F (固定字串) 比正則快數倍
- 避免在極大檔案上使用
-P (PCRE),記憶體佔用高
grep -r 遞迴時配合 --include/--exclude-dir 縮小範圍
- 固定字串多模式用
fgrep -f patterns.txt 讀取模式檔
相關工具
egrep = grep -E (ERE)
fgrep = grep -F (固定字串)
zgrep:直接搜尋 .gz 壓縮檔
ack/rg (ripgrep):程式碼搜尋優化工具,預設忽略 .git、二進制檔