使用 grep
高效检索日志的关键在于结合其参数和正则表达式,以下是一些实用技巧:
1. 基础命令
grep "关键字" /path/to/logfile.log # 直接搜索关键字
grep -i "error" logfile.log # 忽略大小写(如 Error/ERROR)
grep -v "健康检查" logfile.log # 反向排除(过滤无关内容)
grep -c "Timeout" logfile.log # 统计匹配行数
2. 多文件与递归搜索
grep "OOM" *.log # 搜索当前目录所有 .log 文件
grep -r "Connection refused" /var/log/ # 递归搜索目录(含子目录)
grep -R --include="*.log" "panic" /path # 仅递归搜索特定后缀文件
3. 上下文关联
grep -A 3 "Exception" logfile.log # 显示匹配行及后3行(After)
grep -B 2 "WARNING" logfile.log # 显示匹配行及前2行(Before)
grep -C 5 "crash" logfile.log # 显示匹配行前后各5行(Context)
4. 正则表达式增强
grep -E "404|500" logfile.log # 匹配 404 或 500 错误(扩展正则)
grep "^2023-08-01" logfile.log # 匹配以日期开头的行(按时间筛选)
grep "POST /api/v1/\w+" logfile.log # 匹配 API 接口路径(如 /api/v1/login)
5. 性能优化技巧
- 跳过二进制文件:添加
--binary-files=without-match
- 禁用颜色输出(脚本中使用):
--color=never
- 预过滤大文件:结合
cat
或tail
减少范围tail -n 1000 logfile.log | grep "ERROR" # 仅搜索最后1000行
6. 复杂组合案例
# 查找 2023-08-01 10点的 ERROR 日志(排除健康检查)
grep -E "^2023-08-01 10:[0-9]{2}:[0-9]{2}.*ERROR" app.log | grep -v "健康检查"
# 统计所有 5xx 状态码出现的次数
grep -oP 'HTTP/1.1" 5\d{2}' access.log | sort | uniq -c
# 实时监控日志(结合 tail -f)
tail -f app.log | grep --line-buffered "Critical"
7. 处理压缩文件
zgrep "Timeout" access.log.gz # 直接搜索 .gz 压缩文件
zcat access.log.*.gz | grep "404" # 解压后多文件联合搜索
通过结合参数、管道和正则表达式,grep
可以快速定位关键日志。对于 TB 级日志,建议先用 find
按时间过滤文件范围,再交给 grep
处理。