1. 基礎概念
grep
是 Linux 下的文本搜索工具,核心功能是從文件或輸入流中篩選出包含指定關鍵詞的行。
它像“文本界的搜索引擎”,能快速定位關鍵信息,特別適合日志分析、代碼排查等場景。
2. 基礎語法
grep [選項] "搜索詞" 文件名
3. 常用選項與實例
① 簡單搜索
# 在 catalina.out 中查找包含 "ERROR" 的行
grep "ERROR" catalina.out# 示例輸出:
# 2023-10-25 14:00:10 ERROR NullPointerException...
# 2023-10-25 14:05:20 ERROR Database connection failed...
② 忽略大小寫(-i)
# 查找 "error"(不區分大小寫,匹配 ERROR/error/Error)
grep -i "error" catalina.out
③ 顯示行號(-n)
# 顯示匹配行及其行號(方便定位到文件具體位置)
grep -n "NullPointer" catalina.out# 示例輸出:
# 105:2023-10-25 14:00:10 ERROR NullPointerException...
④ 反向匹配(-v)
# 排除包含 "INFO" 的行(只顯示不匹配的行)
grep -v "INFO" catalina.out
⑤ 顯示上下文(-A/-B/-C)
# 顯示匹配行及其后5行(After)
grep -A 5 "OOM" catalina.out # 適合查看堆棧信息# 顯示匹配行及其前3行(Before)
grep -B 3 "Timeout" catalina.out# 顯示匹配行前后各2行(Context)
grep -C 2 "WARN" catalina.out
⑥ 正則表達式(-E)
# 使用正則匹配(例如:以 "ERROR" 開頭或包含 "404")
grep -E "^ERROR|404" catalina.out# 等價于:
egrep "^ERROR|404" catalina.out
⑦ 統計匹配次數(-c)
# 統計 "ERROR" 出現的總次數
grep -c "ERROR" catalina.out# 統計每個文件的匹配次數(多文件時)
grep -c "404" access.log error.log
⑧ 遞歸搜索目錄(-r)
# 在 /var/log 目錄下所有文件中搜索 "Timeout"
grep -r "Timeout" /var/log# 同時顯示文件名和行號
grep -rn "Timeout" /var/log
⑨ 匹配整詞(-w)
# 只匹配完整單詞 "Error"(避免匹配到 "Errors" 或 "ErrorCode")
grep -w "Error" catalina.out
4. 實戰場景
場景1:快速定位 Tomcat 啟動失敗原因
# 查看啟動日志中的錯誤
grep -A 20 "ERROR" catalina.out | less
場景2:統計接口 500 錯誤次數
# 在訪問日志中統計 500 狀態碼
grep " 500 " access.log | wc -l
場景3:過濾無關日志
# 只看 ERROR 和 WARN,排除 INFO 和 DEBUG
grep -E "ERROR|WARN" catalina.out | grep -v "INFO\|DEBUG"
場景4:搜索指定時間段的日志
# 先按時間截取日志,再過濾關鍵詞
sed -n '/2023-10-25 14:00:/,/2023-10-25 15:00:/p' catalina.out | grep "ERROR"
5. 性能技巧
- 大文件搜索:先用
grep
過濾,再用其他命令處理,避免內存溢出。grep "ERROR" huge.log | awk '{print $1}' # 先過濾再提取列
- 壓縮文件搜索:無需解壓,直接使用
zgrep
。zgrep "404" access.log.gz
總結
grep
是 Linux 文本處理的瑞士軍刀,核心能力 = 關鍵詞搜索 + 正則匹配。
掌握常用選項后,可以快速解決以下問題:
- 日志分析:定位錯誤、統計異常
- 代碼調試:查找函數調用、追蹤變量
- 數據清洗:過濾無效數據、提取關鍵字段
記住萬能公式:
grep [選項] "搜索詞" 文件 | 其他命令
(如結合 awk
、sort
、wc
等進一步處理結果)