grep
是 Linux/Unix 系統中用于文本搜索的強大工具,支持基于正則表達式的模式匹配。以下是其詳細用法及實際應用示例:
基本語法
grep [選項] 模式 [文件...]
- 模式:要搜索的字符串或正則表達式。
- 文件:可以是單個文件或多個文件,也可以通過管道符傳遞輸入。
常用選項
選項 | 功能 |
---|---|
-i | 忽略大小寫(如 grep -i "hello" file 匹配 hello 、HELLO ) |
-v | 反向匹配(顯示不包含模式的行) |
-n | 顯示匹配行的行號 |
-l | 僅顯示包含匹配項的文件名 |
-c | 統計匹配行的數量 |
-r / -R | 遞歸搜索目錄中的文件(-R 不跟隨符號鏈接) |
-w | 全字匹配(如 -w "error" 不匹配 error123 ) |
-x | 匹配整行(如 -x "apple" 只匹配整行 apple ) |
-A NUM | 顯示匹配行及其后 NUM 行 |
-B NUM | 顯示匹配行及其前 NUM 行 |
-C NUM | 顯示匹配行及前后各 NUM 行 |
-H | 顯示文件名(多文件時默認開啟) |
-m NUM | 最多顯示 NUM 個匹配項 |
-q | 靜默模式(僅返回狀態碼,0 表示匹配成功) |
-E | 使用egrep命令 |
-color = auto | 為grep過濾結果添加顏色 |
正則表達式
grep
支持 基本正則表達式(BRE) 和 擴展正則表達式(ERE)。
-
基本正則表達式(BRE)【默認支持】
-
.
:匹配任意單個字符grep "a.b" file.txt # 匹配 "aab"、"acb" 等
-
*
:匹配前一個字符 0 次或多次grep "go*gle" file.txt # 匹配 "ggle"、"google" 等
-
^
:匹配行首grep "^start" file.txt # 匹配以 "start" 開頭的行
-
$
:匹配行尾grep "end$" file.txt # 匹配以 "end" 結尾的行
-
-
擴展正則表達式(ERE)
-
|
:邏輯“或”grep -E "error|fail" log.txt # 匹配 "error" 或 "fail"
-
+
:匹配前一個字符 1 次或多次grep -E "go+gle" file.txt # 匹配 "gogle"、"google" 等
-
?
:匹配前一個字符 0 次或 1 次grep -E "colou?r" file.txt # 匹配 "color" 或 "colour"
-
{n,m}
:匹配前一個字符n
到m
次grep -E "a{2,4}" file.txt # 匹配 "aa"、"aaa" 或 "aaaa"
-
-
字符集合
-
[abc]
:匹配任意一個字符(a、b 或 c)grep "[0-9]" file.txt # 匹配任意數字
-
[^abc]
:匹配不在集合中的字符grep "[^0-9]" file.txt # 匹配非數字字符
-
擴展知識BRE、ERE
BRE(基本正則表達式)
-
支持的元字符:
^
(行首)、$
(行尾)、.
(任意單個字符)、*
(零次或多次匹配)、[]
(字符集)、\{m,n\}
(重復次數)。 -
需要轉義的元字符:
(
和)
:需要轉義為\(...\)
才能表示分組。{}
:需要轉義為\{m,n\}
才能指定重復次數。|
:需要轉義為\|
才能表示“或”操作。
-
示例:
# 匹配以 "error" 開頭的行(BRE) grep '^error' /var/log/syslog# 匹配連續 3 到 5 個數字(BRE) grep '[0-9]\{3,5\}' /var/log/syslog
ERE(擴展正則表達式)
-
支持的元字符:BRE 的所有元字符,外加以下擴展:
+
:前一個字符出現 1 次或多次。?
:前一個字符出現 0 次或 1 次。{m,n}
:前一個字符出現 m 到 n 次(無需轉義)。()
:分組(無需轉義)。|
:邏輯“或”操作(無需轉義)。
-
無需轉義:
+
、?
、{}
、()
、|
。 -
示例:
# 匹配 "error" 或 "fail"(ERE) grep -E 'error|fail' /var/log/syslog# 匹配連續 3 到 5 個數字(ERE) grep -E '[0-9]{3,5}' /var/log/syslog
高級用法
-
遞歸搜索
grep -r "error" /var/log/ # 在 /var/log 目錄及其子目錄中搜索 "error"
-
統計匹配行數
grep -c "success" file.txt # 統計 file.txt 中包含 "success" 的行數
-
顯示上下文
grep -A 2 -B 1 "keyword" file.txt # 顯示匹配行、前1行和后2行
-
多模式匹配
grep -e "pattern1" -e "pattern2" file.txt # 同時搜索 pattern1 和 pattern2
-
排除特定文件類型
grep --include="*.log" "error" /path/ # 僅搜索 .log 文件 grep --exclude="*.tmp" "error" /path/ # 排除 .tmp 文件
-
高亮匹配內容
grep --color=auto "keyword" file.txt # 匹配內容高亮顯示
常見場景示例
-
忽略大小寫搜索
grep -i "linux" file.txt # 匹配 "Linux"、"LINUX" 等
-
查找不包含某字符串的行
grep -v "skip" file.txt # 顯示不包含 "skip" 的行
-
統計匹配行數
grep -c "404" access.log # 統計日志中 404 錯誤的數量
-
遞歸搜索并顯示文件名
grep -rl "TODO" /project/ # 列出 /project/ 中包含 "TODO" 的文件名
-
使用正則表達式
grep -E "^#include" file.c # 匹配以 #include 開頭的行 grep -o "\b[0-9]\+\b" file.txt # 僅輸出所有獨立的數字
egrep核心區別
特性 | grep | egrep |
---|---|---|
正則表達式類型 | 基本正則表達式 (BRE) | 擴展正則表達式 (ERE) |
性能 | 更快(處理簡單模式) | 稍慢(處理復雜模式) |
語法靈活性 | 需要轉義特殊字符(如 | , \+ ) | 直接使用特殊字符(如 ` |
系統兼容性 | 所有 Unix/Linux 系統均支持 | 部分系統(如 macOS)可能不預裝 |
等效命令 | grep (默認) | grep -E (與 egrep 等效) |
簡單總結
- grep:適合簡單模式匹配,兼容性更好,性能更高。
- egrep:適合復雜模式匹配,語法更簡潔,但性能稍遜。
- 在實際使用中,如果需要擴展正則表達式功能,推薦使用 grep -E(等效于 egrep),這樣可以避免系統兼容性問題。
注意事項
- 擴展正則表達式:使用
egrep
或grep -E
啟用更靈活的正則語法(如+
、?
、()
分組)。 - 搜索結果太多:分頁查看:
grep "pattern" file.txt | less
- 性能優化:搜索大文件時,使用
-m
限制匹配數量或--binary-files=without-match
跳過二進制文件。 - 幫助文檔:通過
man grep
查看完整選項列表和詳細說明。
如果有意見和或者建議歡迎留言討論!