| 功能 | BRE (預設) | ERE (-E) | PCRE (-P) |
| 單字符 | . | . | . |
| 零或多次 | * | * | * |
| 一次或多次 | \+ | + | + |
| 零或一次 | \? | ? | ? |
| 分組捕獲 | \(\) | () | () |
| 或 | \| | | | | |
| 行首 | ^ | ^ | ^ |
| 行尾 | $ | $ | $ |
| 詞首 | \< | \< | \b |
| 詞尾 | \> | \> | \b |
| 反向引用 | \1 | \1 | \1 |
實戰範例集
1. 基礎搜索
grep 'error' /var/log/messages # 簡單匹配
grep -i 'failed' *.log # 忽略大小寫
grep -n 'TODO' src/*.c # 顯示行號
grep -r 'FIXME' /project --include='*.py' # 遞歸 + 檔案過濾
2. 正則進階
grep -E '^[[:space:]]*$' file # 空白行
grep -P '^\d{4}-\d{2}-\d{2}' logfile # ISO 日期行 (PCRE)
grep -w 'root' /etc/passwd # 整詞匹配 root
grep -E '\<[A-Z]{3,}\>' file # 3 個以上大寫單詞
grep 'pattern1\|pattern2' file # 或 (BRE 需轉義)
grep -E 'pattern1|pattern2' file # 或 (ERE)
grep 'pattern1' file | grep 'pattern2' # 且 (管道串聯)
3. 上下文與統計
grep -C 3 'panic' /var/log/kern.log # 前後各 3 行
grep -c '^From:' mailbox # 郵件計數
grep -l 'TODO' *.c *.h # 列出含 TODO 的檔案
4. 實用組合拳
# 統計當前目錄下程式碼行數(排除空行、註釋)
grep -vE '^\s*$|^\s*#' *.py | wc -l
# 找出佔用磁碟最大的 10 個目錄
du -h --max-depth=1 | sort -hr | head
# 實時監控日誌關鍵字
tail -f /var/log/nginx/access.log | grep --line-buffered ' 50[0-9] '
效能提示
- 固定字串搜索用
grep -F (fgrep),避免正則解析開銷。
- 大檔案優先用
grep -m 1 只找首個匹配,或配合 awk/sed 流式處理。
- 避免
grep . * 產生大量「Is a directory」輸出,加 -d skip 或 -r。
總結
掌握 -i -v -n -r -w -E -P -A/B/C --color 核心選項,熟悉 BRE/ERE/PCRE 差異,善用管道組合,即可應對 95% 文本搜索場景。複雜結構化數據建議改用 jq (JSON)、xq (XML)、awk (欄位)。