用 grep -c 统计含关键词的行数,一行多匹配只计1次;要统计总出现次数需用 grep -o | wc -l;可结合 tail、sed、zcat 等预过滤提升效率;进阶可用 sort | uniq -c 实现分类频次统计。

直接用 grep -c 最快,但要注意它统计的是“含该文本的行数”,不是“文本出现的总次数”。如果一行里有多个 error,-c 只算 1 次;要算所有出现次数(比如一行里 “ERROR” 出现了 3 次),得用 grep -o | wc -l。
按行统计:查包含关键词的行有多少行
适用于大多数场景,比如“ERROR”、“404”、“timeout”这类每行最多出现一次的典型日志标记:
- grep -c "ERROR" /var/log/app.log —— 返回含 ERROR 的行数
- grep -c -i "error" app.log —— 加 -i 忽略大小写
- grep -c "500" access.log —— 统计 HTTP 500 错误行数
按字符/单词统计:查关键词总共出现了多少次
适合需要精确计数的情况,例如一行中可能重复出现同一关键词(如调试日志里频繁打印 “retry”):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- grep -o "ERROR" app.log | wc -l —— -o 把每次匹配单独输出一行,再用 wc -l 计总数
- grep -o -i "fail" *.log | wc -l —— 多文件 + 忽略大小写 + 总频次
- grep -o -E "(ERROR|WARN)" system.log | wc -l —— 用扩展正则匹配多个词
结合时间或上下文缩小范围再统计
大日志文件直接全量扫慢且不准,建议先过滤再计数:
- tail -n 10000 app.log | grep -c "NullPointerException" —— 查最近 1 万行里的空指针错误次数
- sed -n '/2026-10-12.*ERROR/p' app.log | wc -l —— 只统计今天带 ERROR 的行(假设日志有标准时间前缀)
- zcat app.log.gz | grep -c "Connection refused" —— 直接处理压缩日志,免解压
进阶:分类统计并排序(比如看哪类错误最多)
不只看总数,还想看出错类型分布:
- grep -o -E "(ERROR|WARN|FATAL)" app.log | sort | uniq -c | sort -nr —— 统计各等级错误出现频次,倒序排列
- awk '/ERROR/{print $NF}' app.log | sort | uniq -c | sort -nr | head -5 —— 提取每条 ERROR 日志的最后一个字段(常是错误码或类名),统计 Top 5










