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
  1. 先排序,把相同内容聚在一起。
  2. uniq -c 统计每一团内容的数量。
  3. 最后按数量倒序排列 (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 必须喂给它排好序的数据,否则它会把不相邻的相同行视为不同的记录。)

posted @ 2026-01-24 11:27  Terrasse  阅读(0)  评论(0)    收藏  举报