首页/系统/Linux 运维命令速查/uniq 去除相邻重复行
文本处理77 条

uniq 去除相邻重复行

去重工具:只处理相邻重复行,所以先 sort;-c 计数、-d 只显示重复、-u 只显唯一。

Linux 运维命令速查系统更新于 2026-10-13

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 -uuniq 做不到,必须先排好序
保留最后一次出现sort 后接 tac 再处理排序会打乱原有顺序
-w N 只比较每行前 N 个字符来判定重复,适合排序键恰好位于行首的场景;键在中间时仍要先用 cut 或 awk 把键切到行首再排序。要按列统计时,先规范化分隔符能避免同一逻辑键被拆成多个组。

易错点

  • 忘记先 sort:不相邻的重复行不会被合并,这是 uniq 最常见的误用
  • uniq -c 的输出带前导空格,脚本二次解析时要先处理掉
  • -i 忽略大小写的行为受 locale 影响,跨机器跑同样命令结果可能不同
  • uniq 按整行比较,只想按某一列去重就得先把那一列切出来
  • 用 -f 或 -s 跳字段时,跳过的内容仍会出现在输出行里,别把它当成已被去掉
  • -D 输出每个重复组里的全部行,-d 每个重复组只输出一行,两者结果条数差别很大,统计口径会被整体带偏

数据来源与参考

  • man 1 uniq(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌