uniq只能去除连续重复行,必须先用sort将相同内容排在一起才能真正去重;其原理是仅比较相邻两行,不扫描全文或建哈希表。

直接用 uniq 只能去掉**连续重复的行**,对分散在文件各处的相同内容无效。真正实用的去重必须配合 sort 先排序,再交给 uniq 处理。
为什么必须先 sort 再 uniq
uniq 的设计逻辑是逐行比对相邻两行是否完全一致。它不扫描全文,也不建哈希表,只看“上一行和当前行”。所以:
- 文件里有三行
apple,分别在第1、第5、第9行 →uniq file会原样输出全部三行 - 同一文件先执行
sort file | uniq→ 所有apple被排到一起,uniq就能识别并合并为一行
常用组合与效果
假设原始文件 data.txt 内容为:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
banana
apple
cherry
banana
不同写法对应不同结果:
-
sort data.txt | uniq→ 输出三行:apple、banana、cherry -
sort data.txt | uniq -c→ 每行前加计数:2 apple、2 banana、1 cherry -
sort data.txt | uniq -d→ 只显示重复项(出现≥2次的):apple、banana -
sort data.txt | uniq -u→ 只显示唯一项(只出现1次的):cherry
按列或字符跳过部分内容比较
如果每行有固定结构,比如带编号或时间戳,只想按后面内容去重:
-
sort -k2 data.txt | uniq -f1:用sort -k2按第2列排序,再用uniq -f1忽略首字段(即跳过第1列)比较 -
sort data.txt | uniq -s5:忽略每行开头5个字符后再判断是否重复
忽略大小写等细节
日志或用户输入常含大小写混杂:
-
sort -f data.txt | uniq -i:排序时忽略大小写,去重时也忽略大小写 - 注意:
-i仅影响比较,不改变原始大小写输出










