统计Linux日志中关键字次数需区分「含关键字的行数」和「关键字总出现次数」:前者用grep | wc -l,后者用grep -o | wc -l;压缩日志用zgrep,复杂场景用awk。

统计 Linux 日志中某个关键字出现的次数,核心是区分「包含关键字的行数」和「关键字实际出现的总次数」——两者结果可能完全不同,选错方法容易误判问题严重程度。
统计包含关键字的行数
这是最常用、也最稳妥的统计方式,适合快速评估“有多少条日志提到了该关键词”。命令简洁明确:
- 基础写法:`grep "error" /var/log/syslog | wc -l`
- 忽略大小写:`grep -i "error" /var/log/syslog | wc -l`
- 整词匹配(避免匹配到 error_log 或 errors):`grep -iw "error" /var/log/syslog | wc -l`
- 递归统计整个日志目录下所有匹配行数:`grep -r -i "timeout" /var/log/ | wc -l`(注意:会把文件名也计入行数,如需精确,加 `-h` 参数隐藏文件名)
统计关键字实际出现次数
当一个日志行里多次出现同一关键词(比如一行含 3 个 “failed”),你希望知道总共出现了几次,就得用 -o 选项让 grep 把每次匹配都单独输出一行:
- 标准组合:`grep -o "failed" /var/log/auth.log | wc -l`
- 忽略大小写 + 统计总次数:`grep -io "warning" /var/log/syslog | wc -l`
- 配合正则匹配多个变体(如 error / ERROR / Error):`grep -E -io "error|fail" /var/log/app.log | wc -l`
压缩日志与多文件批量统计
生产环境日志常被轮转压缩,直接解压再查既慢又占空间:
- 查 .gz 文件无需解压:`zgrep -i "panic" /var/log/kern.log.1.gz | wc -l`
-
同时查普通日志和压缩日志:先用 `find` 找出所有相关文件,再统一处理:
`find /var/log -name "syslog*" -exec zgrep -i "oom" {} \; | wc -l`(自动适配 .gz 和未压缩文件)
用 awk 做更精细的统计
当需要按条件累加、跨字段关联或排除干扰内容时,awk 更灵活:
-
统计某列中关键词出现次数(如只统计第 4 列为 “500” 的行数):
`awk '$4 == "500" {count++} END {print count+0}' /var/log/nginx/access.log` -
统计每行中关键词出现频次并求和(等效于 grep -o):
`awk '{n += gsub(/timeout/, "&")} END {print n+0}' /var/log/messages` -
排除带注释或空行干扰后再统计:
`awk '!/^#/ && NF > 0 {n += gsub(/debug/, "&")} END {print n+0}' app.conf`










