grep [選項] PATTERN [FILE...]
grep [選項] -e PATTERN1 -e PATTERN2 [FILE...]
grep [選項] -f pattern_file [FILE...]
grep 默認使用 **基礎正則 (BRE)**,元字符需轉義才具特殊含義;加 `-E` 或用 `egrep` 切換至 **擴展正則 (ERE)**,元字符無需轉義。
| 元字符 | BRE 寫法 | ERE 寫法 | 含義 | 範例匹配 |
|---|---|---|---|---|
| 行首 | ^ | ^ | 錨定行首 | `^root` 匹配以 root 開頭的行 |
| 行尾 | $ | $ | 錨定行尾 | `bash$` 匹配以 bash 結尾的行 |
| 任意單字符 | . | . | 除換行外任意字符 | `c.t` 匹配 cat, cut, c9t |
| 零次或多次 | \* | * | 前一字符重複 0~n 次 | `ab*c` 匹配 ac, abc, abbc, abbbc |
| 字符集合 | [...] | [...] | 匹配括號內任一字符 | `[Cc]at` 匹配 Cat 或 cat |
| 排除字符集 | [^...] | [^...] | 匹配非括號內字符 | `[^0-9]` 匹配非數字字符 |
| 詞首邊界 | \< | \b | 單詞開始位置 | `\ |
| 詞尾邊界 | \> | \b | 單詞結束位置 | `root\>` 匹配 root, groot 不匹配 roots |
| 分組捕獲 | \(...\) | (...) | 子模式分組,可反向引用 | `\(ab\)\1` 匹配 abab |
| 反向引用 | \1 ~ \9 | \1 ~ \9 | 引用前面分組內容 | 同上 |
| 指定次數 | \{m,n\} | {m,n} | 前一元素重複 m~n 次 | `a\{3,5\}` 匹配 aaa, aaaa, aaaaa |
| 或運算 | 不支援 | \| | 多模式任一匹配 | `cat|dog` 匹配 cat 或 dog |
| 一次或多次 | 不支援 | + | 前一元素 1~n 次 | `ab+c` 匹配 abc, abbc... |
| 零次或一次 | 不支援 | ? | 前一元素 0~1 次 | `ab?c` 匹配 ac, abc |
| 選項 | 長選項 | 功能 | 典型場景 |
|---|---|---|---|
| -i | --ignore-case | 忽略大小寫 | `grep -i error log` |
| -v | --invert-match | 反向匹配 (顯示不匹配行) | `grep -v ^# config` 排除註釋行 |
| -n | --line-number | 顯示行號 | `grep -n TODO *.c` |
| -c | --count | 僅輸出匹配行數 | `grep -c "failed" auth.log` |
| -l | --files-with-matches | 僅列出匹配的文件名 | `grep -r -l "API_KEY" .` |
| -L | --files-without-match | 列出不匹配的文件名 | `grep -L "license" *.txt` |
| -r / -R | --recursive | 遞歸搜尋目錄 (-R 跟隨符號鏈接) | `grep -r "pattern" /etc` |
| -w | --word-regexp | 全詞匹配 (邊界 \b) | `grep -w root /etc/passwd` |
| -x | --line-regexp | 整行匹配 | `grep -x "export PATH=..."` |
| -A NUM | --after-context | 顯示匹配行後 NUM 行 | `grep -A 3 "ERROR" log` |
| -B NUM | --before-context | 顯示匹配行前 NUM 行 | `grep -B 2 "Exception" log` |
| -C NUM | --context | 顯示匹配行前後各 NUM 行 | `grep -C 5 "CRITICAL" log` |
| --color=auto | 高亮匹配文本 (默認開啟) | 別名 `alias grep='grep --color=auto'` | |
| -E | --extended-regexp | 使用擴展正則 (ERE) | `grep -E "cat|dog" file` |
| -P | --perl-regexp | 使用 Perl 相容正則 (PCRE) | `grep -P "\d{4}-\d{2}-\d{2}"` |
| -F | --fixed-strings | 字面字串匹配 (無正則) | `grep -F "error.code=500" log` |
| -f FILE | --file | 從文件讀取模式 (每行一模式) | `grep -f patterns.txt target.log` |
| -o | --only-matching | 僅輸出匹配部分 (非整行) | `grep -oE "\d{1,3}(\.\d{1,3}){3}" log` 提取 IP |
| -h | --no-filename | 多文件時不顯示文件名 | `grep -h pattern file1 file2` |
| -H | --with-filename | 強制顯示文件名 (單文件時) | `grep -H pattern file` |
| -a | --text | 將二進制文件視為文本處理 | `grep -a "string" binary.bin` |
| -z | --null-data | 以 NUL (\0) 分隔行 (配合 find -print0) | `grep -z "pattern" file` |
# 錯誤:管道符未轉義,被 shell 解析
grep -r "UserService" . | grep -v "svn|test|auto_load"
# 正確:grep -E 內部使用 \| 或用 grep -v 多次管道
grep -r "UserService" . | grep -v -E "svn|test|auto_load"
# 或
grep -r "UserService" . | grep -v "svn" | grep -v "test" | grep -v "auto_load"
# 更優雅:單一 grep 完成 (需 GNU grep 支援 -E 和排除目錄)
grep -r -E "UserService" . --exclude-dir={.svn,.git,test,auto_load}
# IPv4 (PCRE 最精準)
grep -oP '\b(?:\d{1,3}\.){3}\d{1,3}\b' access.log
# 郵箱
grep -oE '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' file
# 域名
grep -oE '\b(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}\b' file
# 顯示匹配行及前後 3 行,含文件名與行號
grep -rn -C 3 "FATAL" /var/log/
# 統計各文件匹配次數
grep -rc "ERROR" /var/log/ | sort -t: -k2 -nr
# 僅搜尋 .c/.h 文件
find . -name "*.c" -o -name "*.h" | xargs grep -n "TODO"
# 避免參數過長
find . -name "*.log" -print0 | xargs -0 grep "CRITICAL"
LC_ALL=C grep -r "pattern" .
grep 是文本處理瑞士軍刀。熟記 BRE/ERE/PCRE 三種模式差異、掌握 `-v/-o/-A/-B/-C/-r/-w/-F/-E/-P` 高頻選項組合、善用 `--exclude-dir` 與 `LC_ALL=C` 優化,能解決 95% 日誌分析、代碼搜尋、配置檢查需求。複雜提取任務請轉向 `awk`、`sed` 或 `ripgrep`。