uniq 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
uniq——文本处理命令族(见文本处理命令族)。它和 sort 绑定:离开 sort,uniq 基本无用。
uniq 对文本行做"重复处理"——报告、计数、或去掉重复行。但它有个致命限制:只比较相邻的行。所以单独用 uniq 几乎没意义,必须先 sort 把相同行聚到一起。
一、必须先 sort
# 错误:相同行不相邻,uniq 看不到重复
cat ips.txt | uniq -c
# 正确:先 sort 让相同行相邻
sort ips.txt | uniq -c这是 uniq 最容易踩的坑。文件里两行相同的 IP 若中间夹了别的行,uniq 会当成两个不同行。只有
sort | uniq才正确——sort 把相同行摞一起,uniq 才能识别。记住铁律:uniq 永远跟在 sort 后面。
二、常用选项
sort file | uniq -c # 计数:每行前加出现次数(最常用)
sort file | uniq # 去掉重复,只留每类一行
sort file | uniq -d # 只显示重复出现的行(出现 ≥2 次)
sort file | uniq -u # 只显示唯一行(只出现 1 次)
sort file | uniq -i # 忽略大小写比较
sort -k1 file | uniq -c -w5 # -w 只比较前 5 个字符判断重复
-c计数最高频,输出格式是"次数 内容",正好喂给sort -rn排榜。-d(duplicates)只看重复行、-u(unique)只看独苗——排查"哪些出现了多次 / 哪些是孤例"时用。-w限定比较前 N 个字符,按"前缀"去重时有用。
三、实战:频率统计 Top N
# 统计访问最多的 IP Top 10
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head -10
# 统计各 HTTP 状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 找出重复出现的用户名(出现 ≥2 次)
sort users.txt | uniq -d第一条是经典四段式:cut 取列 → sort 聚合相同 →
uniq -c计数 →sort -rn按次数降序 → head 取头。把任意"统计某字段出现频率"的需求都套这个骨架,从日志分析到数据清洗通用。详见 grep 实战 与 sort。
四、uniq vs awk 计数
# uniq 方式(管道)
sort file | uniq -c
# awk 方式(一步,无需 sort)
awk '{a[$0]++} END {for (k in a) print a[k], k}' file | sort -rn| 方式 | 特点 |
|---|---|
sort | uniq -c | 直观、管道清晰,但要多一趟 sort |
| awk 关联数组 | 一步到位、无需预排序,大文件略快 |
小数据
sort|uniq -c够用且好读;大数据或已在 awk 里处理时,用 awk 的a[$0]++关联数组计数更省一趟排序(见 awk 分组计数)。两者结果一致,按场景与可读性选。
一句话总结
uniq = 重复行处理,但只比较相邻行——必须 sort | uniq 才有意义:-c 计数(接 sort -rn 排榜)、-d 只显重复、-u 只显唯一、-i 忽略大小写;是"频率统计四段式 cut|sort|uniq -c|sort -rn"的核心一环,也可被 awk 关联数组一步替代。