grep -A1 用于精准匹配报错行及下一行,需结合 -i/-E/-m 等选项识别 ERROR、Exception 等关键词,并验证下一行是否含 reqId、param 或堆栈等关键信息,必要时用 -A2 或 grep -oP 提取具体值。

用 grep -A1 查找报错行及其下一行,关键在于精准匹配错误标识、避免误抓,并确保下一行确实含关键参数(如请求ID、入参、堆栈起始等)。
明确你要找的“报错行”特征
日志中报错行通常包含固定关键词,比如:
- ERROR、Exception、failed、timeout、500、NullPointerException
- 注意大小写和空格:有些日志用 [ERROR],有些是小写 error:,建议先用 grep -i "error" app.log | head -5 看真实格式。
用 grep -A1 抓取报错行 + 紧邻下一行
-A1 表示“after 1 line”,即匹配行之后的 1 行。常用组合:
-
grep -A1 -i "Exception\|ERROR" app.log—— 同时匹配多种错误标识 -
grep -A1 -E "java\.lang\.NullPointerException|Connection refused" app.log—— 用-E支持正则,提高精度 -
grep -A1 -m5 "ERROR" app.log——-m5限制只输出前 5 组,防爆屏
确认下一行是否真含关键参数
不是所有“下一行”都有用——常见有效内容有:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 堆栈第一行(如
at com.example.Service.handle(...)) - 请求上下文(如
reqId=abc123、userId=U789、param={\"key\":\"value\"}) - 异常原因短句(如
Caused by: java.net.ConnectException: Connection refused)
若发现下一行常为空或无关,可改用 -A2 或结合 awk 过滤,例如:grep -A2 "Exception" app.log | grep -E "(reqId=|param=|at com\.|Caused by)"
进阶:直接提取关键参数值,方便复现
定位到目标行后,用 grep -oP 提取具体值:
-
grep -A1 "NullPointerException" app.log | grep -oP "reqId=\K\S+"—— 提取reqId=xxx中的 xxx -
grep -A1 "ERROR" app.log | grep -oP '"id":"\K[^"]*'—— 提取 JSON 中的 id 值 - 配合
sort | uniq -c | sort -nr快速发现高频 reqId 或错误路径
实际排查时,先缩小日志范围(如 tail -n 10000 app.log | grep -A1 ...),再逐步加限。不复杂但容易忽略细节。

















