uniq 是什么
uniq 处理的是相邻重复行:它把连续出现的相同行合并成一条,所以实际使用中几乎总是先 sort 再 uniq。加 -c 顺便计数,-d 只保留出现多次的,-u 只保留只出现一次的。统计类工作里最经典的组合就是 sort 加 uniq -c,再按计数排序取前几名。
基本信息
| 适用平台 | Linux、Unix 通用(GNU coreutils) |
|---|---|
| 命令语法 | uniq [选项] [输入 [输出]] |
| 常用选项 | -c 统计次数 / -d 只显示重复行 / -D 显示全部重复行 / -u 只显示唯一行 / -i 忽略大小写 / -f N 跳过前 N 个字段 / -s N 跳过前 N 个字符 |
| 前提 | 输入需先排序,否则不相邻的重复行不会被合并 |
典型使用场景
- 统计访问来源 IP 的请求量排名
- 找出只出现一次的记录,用来核对数据完整性
- 统计日志里各错误码的出现次数
- 用 -f 跳过时间戳字段后再去重
- 生成去重后的清单文件,供后续脚本处理
常用示例
常用示例
sort ips.txt | uniq -c # 计数
sort ips.txt | uniq -c | sort -rn | head # 取 TOP N
sort names.txt | uniq -d # 只列出重复出现的
sort names.txt | uniq -u # 只列出只出现一次的
uniq -c <(sort app.log) | sort -rn | head # 进程替换写法
sort logs.txt | uniq -f 2 -c # 跳过前两个字段后去重常用选项
| 选项 | 作用 | 提示 |
|---|---|---|
| -c | 每行前面加出现次数 | 输出有前导空格,后续解析用 awk 更稳 |
| -d | 只显示重复出现的行 | 每种重复只显示一条 |
| -D | 显示所有重复行 | 每个实例都输出 |
| -u | 只显示出现一次的行 | 找异常记录常用 |
| -i | 比较时忽略大小写 | 结果与 locale 有关 |
| -f N | 跳过前 N 个字段再比较 | 处理带时间戳的日志 |
统计 TOP N 的万能公式是 sort 加 uniq -c 再加 sort -rn 与 head。中间那次 sort 不能省,否则相同项不相邻,计数会被拆散成多条。
uniq -c 输出的是「空格加数字加空格加内容」的格式,直接用 cut 解析容易被前导空格绊倒,配合 awk 或先去掉多余空格更稳。
与其他命令的分工
| 需求 | 组合 | 说明 |
|---|---|---|
| 统计出现次数 | sort 后接 uniq -c | 必须先排序 |
| 只留重复项 | sort 后接 uniq -d | 只留唯一项用 -u |
| 按前 N 个字符去重 | sort 后接 uniq -w N | 键不在行首时要先切列 |
| 整体去重不计数 | sort -u | uniq 做不到,必须先排好序 |
| 保留最后一次出现 | sort 后接 tac 再处理 | 排序会打乱原有顺序 |
-w N 只比较每行前 N 个字符来判定重复,适合排序键恰好位于行首的场景;键在中间时仍要先用 cut 或 awk 把键切到行首再排序。要按列统计时,先规范化分隔符能避免同一逻辑键被拆成多个组。