
查Linux日志找错误,核心就两条:精准缩小范围 + 快速高亮关键信息。别一上来就cat xxx.log | grep error,容易漏真凶、抓假警。
按时间范围切片,避免全盘扫描
日志动辄几百MB,盲目grep效率低还易误判。先用sed或awk截取可疑时间段:
-
sed -n '/2024-06-15 14:20/,/2024-06-15 14:25/p' /var/log/syslog—— 提取14:20到14:25之间的所有行 -
awk '$0 ~ /^Jun 15 14:[2-3][0-9]:[0-5][0-9]/ {print}' /var/log/messages—— 匹配Jun 15日14:20–14:39间的行(适用于无年份的syslog格式)
用grep组合选项,一次命中要害
单靠-i error太粗糙。推荐这几个实用组合:
-
grep -E -i "(error|fail|exception|panic|segfault)" -A 2 -B 1 /var/log/nginx/error.log—— 同时匹配多种错误关键词,-A 2显示后两行上下文,-B 1显示前一行,方便看堆栈或请求ID -
grep -v "Connection refused\|timeout" access.log | grep "50[0-3]"—— 先排除常见干扰项,再聚焦真正的服务端错误码 -
grep --color=always -n "ORA-" oracle_alert.log——--color高亮关键词,-n标出行号,便于快速跳转
结合less实时过滤,边看边筛
大日志不适合一次性加载。用less +F追尾后,按Shift+F进入follow模式;想临时过滤就按&键,输入正则,比如&ERROR或&"pid [0-9]\+",只显示匹配行,退出过滤按&再回车。
用awk提取结构化字段,绕过文本干扰
当错误混在长日志里(如JSON或key=value格式),grep容易断行错位。直接用awk抽关键字段更稳:
-
awk -F'[: ]+' '$6 ~ /ERROR|WARN/ {print $1,$2,$3,$6,$7}' app.log—— 按空格/冒号切分,检查第6字段是否含ERROR/WARN,只输出时间+级别+消息片段 -
awk -F'"' '/"status":50[0-3]/ {print $0}' access.json.log—— 针对JSON日志,按双引号分割,快速定位5xx响应行
不复杂但容易忽略:错误常藏在“成功”日志之后几行,或被高频INFO淹没。固定套路是——先定时间窗,再筛关键词,最后看上下文。多练几次,10秒内锁定问题源头不是难事。










