grep(Global Regular Expression Print)是 Linux 文本搜索的瑞士軍刀,支援基本/擴展/固定正則,可作為管道過濾器、腳本條件判斷、代碼審計利器。本文系統整理參數、正則語法、POSIX 字符類、5 大實戰場景、返回值在腳本中的應用。
grep [選項] 模式 [文件...]
| 參數 | 說明 | |
|---|---|---|
-E, --extended-regexp | 使用擴展正則(等同 egrep) | |
-F, --fixed-strings | 字面字符串匹配(等同 fgrep,最快) | |
-i, --ignore-case | 忽略大小寫 | |
-v, --invert-match | 反向匹配(顯示不匹配行) | |
-n, --line-number | 顯示行號 | |
-c, --count | 統計匹配行數 | |
-l, --files-with-matches | 僅列出匹配的文件名 | |
-L, --files-without-match | 列出不匹配的文件名 | |
-r, -R, --recursive | 遞歸搜索目錄 | |
-A N | 顯示匹配行及其後 N 行 | |
-B N | 顯示匹配行及其前 N 行 | |
-C N | 顯示匹配行前後各 N 行 | |
-o, --only-matching | 只輸出匹配部分(每行一個) | |
-w, --word-regexp | 全詞匹配 | |
-x, --line-regexp | 全行匹配 | |
-f 文件 | 從文件讀取模式(每行一個) | |
-z, --null-data | 以 \0 分隔行(配合 xargs -0) | |
-q, --quiet | 靜默模式,僅通過返回值判斷 |
| 元字符 | 含義 | 範例 |
|---|---|---|
^ | 行首 | ^root 以 root 開頭 |
$ | 行尾 | bash$ 以 bash 結尾 |
. | 任意單字符 | gr.p 匹配 grep、grip |
* | 前字符 0 次或多次 | ab*c 匹配 ac、abc、abbc |
.* | 任意長度任意字符 | ^.*error |
[] | 字符集合 | [Gg]rep |
[^] | 排除字符集 | [^0-9] 非數字 |
\() | 捕獲組 | \(ab\)\1 匹配 abab |
\< \> | 單詞邊界 | \ |
\{m,n\} | 重複 m~n 次 | 0\{3,5\} 3-5 個 0 |
\w \W | 單詞/非單詞字符 | \w+ |
\b | 單詞邊界(同 \< \>) | \bgrep\b |
[:alnum:] 字母數字、[:alpha:] 字母、[:digit:] 數字[:space:] 空白、[:lower:] 小寫、[:upper:] 大寫[:punct:] 標點、[:cntrl:] 控制字符、[:xdigit:] 十六進制grep '[[:digit:]]\{3\}' file 匹配 3 位數字
ps -ef | grep sshd
# root 1234 1 0 Jan01 ? 00:00:00 /usr/sbin/sshd -D
# root 5678 1234 0 10:00 ? 00:00:00 sshd: user@pts/0
# user 9999 8888 0 10:05 pts/1 00:00:00 grep sshd ← grep 自身
技巧:ps -ef | grep [s]shd 避免匹配 grep 自身
grep -c "ERROR" app.log
# 42
grep -f keywords.txt target.log
# keywords.txt 每行一個模式
grep -rn "TODO" src/
# src/main.c:10: // TODO: fix bug
# src/util.h:5: #define TODO(x)
grep -rl "deprecated" src/ | xargs -r sed -i 's/deprecated/legacy/g'
# 將所有包含 deprecated 的文件中替換為 legacy
if grep -q "success" result.log; then
echo "測試通過"
else
echo "測試失敗"
fi
# 返回值:0=匹配到,1=未匹配,2=文件錯誤/語法錯誤
