grep配合正则表达式是Linux日志过滤最常用方式,核心包括:用精确匹配单词、-E支持多条件或逻辑、^$等锚点控制位置、-v排除空行注释、-C/-n/-c增强可读性与统计。

grep 命令配合正则表达式,是 Linux 日志过滤最常用也最灵活的方式。关键不在于“能不能”,而在于“怎么写才准确、不漏、不误”。下面从实用角度讲清楚几个核心用法。
用单词边界 精确匹配完整关键字
搜索 "error" 时,默认会把 "errors"、"terror"、"enderror" 都带上——这不是你想要的。加 (单词边界)就能限定只匹配独立单词:
-
grep 'error' app.log→ 只匹配单独的 error,跳过 errors、inerror 等 -
grep -i 'warning' /var/log/syslog→ 忽略大小写,匹配 Warning、WARNING、warning - 注意:反斜杠在单引号里不用额外转义,但若用双引号,得写成
"\berror\b"
用 -E 启用扩展正则,一次匹配多个条件
想同时抓 "error" 或 "timeout",或排除某些干扰项,基础 grep 不够用,必须上 -E(等价于 egrep):
-
grep -E 'error|timeout|fail' nginx.error.log→ 匹配任一关键词的行 -
grep -E 'Connection refused|Permission denied' auth.log→ 安全日志中快速定位两类拒绝类错误 - 组合使用更强大:
grep -E '(error|warn).*[0-9]{4}' app.log→ 匹配带年份(如 2024)的 error 或 warn 行
用 ^ $ . [] [^] 控制位置和字符范围
日志格式往往有规律,利用位置锚点和字符集能大幅提升准确性:
-
grep '^ERROR' catalina.out→ 只匹配行首为 ERROR 的记录(常见于 Java 日志) -
grep 'status=[45][0-9][0-9]' access.log→ 匹配 status=4xx 或 5xx 的 HTTP 状态码 -
grep 'user=([^[:space:]]+)' auth.log→ 提取等号后非空格的用户名(( )捕获,[^[:space:]]+表示至少一个非空白字符) -
grep -v '^$' logfile | grep -v '^#'→ 先用 -v 排除空行和注释行
结合上下文与统计,让结果更可读
光有匹配行不够,常需辅助信息来判断问题上下文或严重程度:
-
grep -n -C 2 'fatal' system.log→ 显示行号,并附带前后各 2 行,看清堆栈前因后果 -
grep -c 'panic' dmesg.log→ 统计 panic 出现次数,快速评估内核异常频率 -
grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' secure | sort | uniq -c | sort -nr→ 提取所有 IP 并统计频次,用于排查暴力登录


















