一、grep 命令簡介
`grep`(Global Regular Expression Print)是 Linux 中用于文本搜索的核心工具,支持正則表達式,能快速定位文件中的目標內容。
?二、常用選項(Options)及英文對照
| 選項 | 英文全稱 | 作用 |
|------|----------|------|
| `-i` | `--ignore-case` | 忽略大小寫 |
| `-c` | `--count` | 統計匹配行數 |
| `-n` | `--line-number` | 顯示行號 |
| `-o` | `--only-matching` | 僅輸出匹配內容 |
| `-A` | `--after-context=N` | 顯示匹配行后 N 行 |
| `-B` | `--before-context=N` | 顯示匹配行前 N 行 |
| `-C` | `--context=N` | 顯示匹配行前后各 N 行 |
| `-r` | `--recursive` | 遞歸搜索目錄 |
| `-w` | `--word-regexp` | 匹配完整單詞 |
| `-E` | `--extended-regexp` | 啟用擴展正則表達式 |
三、實戰場景與示例
1. 統計文件中 `error` 出現的次數(忽略大小寫)
說明:統計 `app.log` 中所有包含 `error` 的行數(不區分大小寫)。
命令:
grep -i -c 'error'?app.log
2. 搜索壓縮文件中的特定 JSON 字符串
說明:
在 `logs.zip` 壓縮包中搜索包含 `系統忙,請稍后再試'?的文件,并統計匹配次數。
命令:
zgrep -o -c '系統忙,請稍后再試'?*.zip
# 注意:`zgrep` 是專門用于搜索壓縮文件的工具
?
3. 顯示關鍵詞前后兩行的上下文
?說明:
在 `debug.log` 中搜索 `ConnectionTimeout` 并顯示匹配行及其前后各 2 行的內容。
?命令:
grep -C 2 'ConnectionTimeout'?debug.log
#注意:C是大寫的,如果想要看前兩行用-B? 2,后3行 -A 3
4. 統計時間段內字符串的出現次數
?說明:
在 `access.log` 中統計 `2023-10-01 14:00` 至 `2023-10-01 15:00` 內 `GET /api/user` 的請求次數。
命令:
awk '/2023-10-01 14:[0-5][0-9]/ && /2023-10-01 15:00/ && /GET \ /api\ /user/ {count++} END {print count}' access.log
說明:結合 `awk` 處理時間范圍
?
4.1 查詢日志按時間排序,可以先用 sed 提取時間段內的行,再通過 grep 統計字符串:
sed -n '/00:00:00/,/01:55:00/p' info.log | grep -c 'GET\? \/api\/user'?
?四、更多高頻用法
?1. 遞歸搜索目錄并顯示行號
?說明:
在 `/var/log` 目錄及其子目錄中遞歸搜索 `Permission denied`,并顯示文件名和行號。
命令:
grep -r -n "Permission denied" /var/log
?2. 精確匹配單詞(避免部分匹配)
說明:
在 `config.txt` 中匹配完整的單詞 `port`(避免匹配 `export` 或 `portal`)。
命令:
grep -w 'port'?config.txt
五、注意事項
1. **正則表達式轉義**:若搜索內容包含特殊字符(如 `.`、`*`),需用 `\` 轉義。 ?
??
grep "192\.168\.1\.1" access.log
2. 性能優化:大文件搜索時,可結合 `-m NUM` 限制匹配次數。
?六、總結
掌握 `grep` 的常用選項和組合技巧,能大幅提升日志分析、故障排查的效率。靈活運用正則表達式和上下文控制選項,可覆蓋絕大多數文本搜索場景!
推薦工具: ?
- 復雜正則表達式測試:[RegExr](https://regexr.com/) ?
- 日志分析進階:`awk`、`sed`
希望這篇博客能幫助您快速掌握 `grep` 的核心用法!如果有其他問題,歡迎評論區交流! 🚀