Shell Daily 2026-01-24: 频次统计 (Uniq Count)
Shell Daily 2026-01-24: 频次统计 (Uniq Count)
在排查生产事故时,我们经常面临这种需求:看着疯狂滚动的日志,想知道“到底是哪个 IP 在疯狂请求?”或者“哪种报错出现的频率最高?”。
如果只用 grep,你只能看到满屏的重复信息。虽然你能感觉到某些行出现的次数很多,但无法量化。此时,你需要的是一条能生成排行榜的命令组合。
怎么用
核心工具是 uniq,但它有一个反直觉的特性:它只去重相邻的行。所以它几乎总是和 sort 绑定使用。
uniq -c:在每行前面显示出现的次数 (Count)。- 组合拳:
sort | uniq -c | sort -nr。
- 先排序,把相同内容聚在一起。
uniq -c统计每一团内容的数量。- 最后按数量倒序排列 (
sort -nr),把“榜一大哥”排在最前面。
- 兼容性:POSIX 标准。Linux/macOS 通用。
适用场景
- 流量分析:统计 Nginx/Apache 日志中的 Top 10 访问 IP。
- 异常归类:统计 Application Log 中各类 Exception 的发生次数。
- 数据清洗:检查 CSV 或数据库导出文件中是否存在重复记录。
示例 1:统计报错类型
想知道日志里哪种错误最严重?
# 1. 提取包含 Error 的行
# 2. 排序并统计
$ grep "Error" application.log | sort | uniq -c
15 Connection refused
240 NullPointerException <-- 罪魁祸首
2 Timeout
示例 2:生成 Top 5 访问者 (经典连招)
这是运维面试中的必考题,也是实战中的高频操作。
# 假设日志格式第一列是 IP
# awk 提取 IP -> 排序聚类 -> 统计次数 -> 按次数倒序 -> 取前5
$ awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -5
8920 192.168.1.50
4501 10.0.0.2
1200 172.16.0.1
...
(注:切记 uniq 必须喂给它排好序的数据,否则它会把不相邻的相同行视为不同的记录。)

浙公网安备 33010602011771号