sort 与 uniq:文本排序去重的黄金搭档
处理日志、统计报表时,sort 和 uniq 几乎总是成对出现:先排序,再去重计数。这篇用真实命令过一遍最常用的组合,全部在 Ubuntu 24.04 上实测。
sort:排序的十八般武艺
基本排序
sort file.txt # 按字典序升序(默认)
sort -r file.txt # 降序
sort -n file.txt # 按数值排序(10 会排在 9 后面, 字典序会排错)
sort -u file.txt # 排序并去重(等价 sort | uniq)最经典的坑是 -n:字典序下 10 排在 2 前面,数值排序才能得到正确顺序。
按"人类可读"大小排序
du -h 输出的是 24K、8.6G 这种带单位的字符串,直接 sort 会按字母排(1.7G 排在 210M 前面)。-h 就是为这种场景设计的:
du -sh /usr /var /opt /home /boot /tmp 2>/dev/null | sort -h
从 24K 到 8.6G 严格按真实大小升序——这是 sort -n 做不到的。
uniq:去重与计数
uniq file.txt # 去除相邻重复行
uniq -c file.txt # 每行前显示出现次数
uniq -d file.txt # 只显示重复的行关键前提:uniq 只能去掉相邻的重复行——所以必须先 sort 再 uniq,这也是它俩永远成对出现的原因:
printf "banana\napple\ncherry\nbanana\napple\napple\n" > /tmp/fruits.txt
sort /tmp/fruits.txt # apple apple apple banana banana cherry
sort -u /tmp/fruits.txt # apple banana cherry
sort /tmp/fruits.txt | uniq -c # 3 apple / 2 banana / 1 cherry
实战:统计日志里谁最"话多"
排查系统问题时,最常用的套路是"按字段提取 → sort → uniq -c → sort -rn → head"——统计日志里出现最多的进程:
awk '{print $3}' /var/log/syslog \
| sed 's/\[.*//;s/://' \
| sort | uniq -c | sort -rn | head -6输出:
24232 systemd
1609 kernel
1532 CRON
271 containerd
171 systemd-networkd
140 cups.cupsduniq -c 计数后 sort -rn 按次数降序,一眼看出 systemd 是日志主力——这个管道是"日志分析第一式",配合 grep/sed/awk 三剑客 食用更佳。
小结
| 场景 | 命令 | |||
|---|---|---|---|---|
| 字典序排序 | sort file | |||
| 数值排序 | sort -n file | |||
| 人类可读大小排序 | sort -h | |||
| 去重(先排序) | sort -u file 或 `sort file \ | uniq` | ||
| 统计出现次数 | `sort file \ | uniq -c \ | sort -rn` | |
| 字段提取后统计 | `awk '{print $N}' log \ | sort \ | uniq -c \ | sort -rn` |
记住一句话:排序去重计数,sort | uniq -c | sort -rn 是万能管道。
评论 (0)
暂无评论,快来抢沙发吧!