高效查日志进阶指南:掌握grep命令的完整技巧
高效查日志进阶指南:掌握grep命令的完整技巧
查看匹配行前后上下文
1. 查看匹配行及前面N行(-B参数)
有时候我们需要查看异常发生前的上下文,这时可以使用-B(Before)参数:
# 查找NullPointerException,并显示前面5行和后面50行
grep -B 5 -A 50 "java.lang.NullPointerException" a.log
2. 查看匹配行前后N行(-C参数)
-C(Context)参数可以同时显示匹配行前后N行内容:
# 显示匹配行前后各10行
grep -C 10 "java.lang.NullPointerException" a.log
组合使用技巧
1. 实时监控日志并显示上下文
# 实时监控并显示异常前后各20行
tail -f a.log | grep -C 20 "java.lang.NullPointerException"
2. 查找压缩日志中的上下文
# 查找压缩日志中的异常及前后15行
zgrep -C 15 "java.lang.NullPointerException" *.gz
高级应用场景
1. 查找特定时间段的日志
# 查找11:00到11:30之间的异常
grep -C 10 "java.lang.NullPointerException" a.log | grep "2025-07-03 11:[0-3][0-9]"
2. 多条件组合查询
# 查找包含NullPointerException但不包含"expected"的日志
grep -A 50 "java.lang.NullPointerException" a.log | grep -v "expected"
总结表
| 参数 | 功能 | 示例 |
|---|---|---|
| -B N | 显示匹配行前N行 | grep -B 5 "error" log |
| -A N | 显示匹配行后N行 | grep -A 50 "exception" log |
| -C N | 显示匹配行前后各N行 | grep -C 10 "warning" log |
| -v | 反向匹配(排除) | grep -v "debug" log |
| -i | 忽略大小写 | grep -i "nullpointer" log |
| -H | 显示文件名 | grep -H "error" *.log |
掌握这些技巧后,你将能够更高效地定位日志中的问题,快速获取完整的上下文信息,而不再局限于单行日志的查看。
日志查询专家指南:从基础到高阶的完整grep技巧
一、基础查询技巧
1. 查看匹配行前后上下文
# 查看匹配行及前5行
grep -B 5 "pattern" file.log
# 查看匹配行及后50行(适合查看异常堆栈)
grep -A 50 "Exception" file.log
# 查看匹配行前后各10行(完整上下文)
grep -C 10 "Error" file.log
2. 实时日志监控
# 实时监控日志并显示匹配行及后50行
tail -f application.log | grep -A 50 "NullPointerException"
# 实时监控并高亮显示匹配内容
tail -f application.log | grep --color=auto -C 10 "ERROR"
二、高级查询技巧
1. 多条件组合查询
# 查找包含A但不包含B的日志
grep "ServiceA" app.log | grep -v "DEBUG"
# 同时查找多个关键词(OR条件)
grep -E "Error|Exception|Timeout" system.log
# 查找特定时间段的日志
grep "2025-07-28 14:" app.log | grep -A 30 "Critical"
2. 统计与分析
# 统计错误出现次数
grep -c "NullPointerException" *.log
# 统计每小时错误数量
grep "NullPointerException" app.log | cut -d' ' -f2 | cut -d: -f1 | uniq -c
# 查找最频繁的错误类型
grep -o "Exception: [A-Za-z]*" app.log | sort | uniq -c | sort -nr
三、压缩日志处理
# 查看压缩日志中的内容
zgrep -H -A 50 "OutOfMemoryError" *.gz
# 批量解压并搜索历史日志
for f in *.gz; do echo "=== $f ==="; zgrep "ConnectionTimeout" "$f"; done
# 跨多日日志搜索
find . -name "*.log*" -exec zgrep -H -C 5 "DatabaseError" {} \;
四、输出格式控制
# 显示行号
grep -n "Warning" app.log
# 只显示匹配部分(适合提取特定字段)
grep -o "user_id=[0-9]*" access.log
# 彩色输出并显示文件名
grep --color=auto -H "404" *.log
五、性能优化技巧
# 快速搜索大文件(禁用颜色和行号)
grep --color=never -n "pattern" large.log
# 并行搜索多个文件
find . -name "*.log" | xargs -P 4 grep "Error"
# 使用ack-grep替代grep(更快的代码搜索工具)
ack "Exception" --java
六、实用查询示例
1. 查找HTTP 5xx错误
grep "HTTP/1.[01]\" 5[0-9][0-9]" access.log
2. 查找慢查询(响应时间>5秒)
grep "response_time=[5-9][0-9][0-9][0-9]" app.log
3. 查找特定用户的日志
grep "user_id=12345" *.log | grep -C 5 "purchase"
七、日志分析工作流
- 初步定位:先用
-C参数获取完整上下文 - 缩小范围:添加时间过滤或其他条件
- 深入分析:提取特定字段或统计频率
- 长期监控:设置实时告警或定期扫描
通过掌握这些技巧,你可以将日志查询效率提升10倍以上,快速定位各种系统问题。记住,好的日志查询策略应该是:从宽泛到具体,从整体到细节。
本文来自博客园,作者:Micky233,转载请注明原文链接:https://www.cnblogs.com/geek233/p/19009296

浙公网安备 33010602011771号