Linux uniq 命令(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Linux 系统中,uniq
命令是一个轻量级但功能强大的工具,它能够帮助用户快速处理重复数据。无论是日志分析、文本去重,还是数据统计,uniq
命令都能提供简洁高效的解决方案。对于编程初学者和中级开发者而言,掌握 uniq
命令不仅能提升日常操作效率,更能为后续学习更复杂的 Shell 脚本或数据处理工具打下基础。
本文将从 uniq
命令的核心功能出发,结合实际案例和代码示例,逐步讲解其使用方法、进阶技巧以及与其他命令的协同应用。通过形象的比喻和循序渐进的讲解,帮助读者深入理解这一工具的逻辑与价值。
一、uniq
命令的核心功能与基础用法
1.1 基础语法与核心逻辑
uniq
命令的核心功能是去除重复行。它的基本语法如下:
uniq [选项] [输入文件]
但需要注意,uniq
只能删除相邻的重复行。因此,若要处理非相邻重复数据,必须先通过 sort
命令对文件内容进行排序。
比喻理解:
可以将 uniq
想象为一位“整理师”,它会逐一检查文件中的每一行。如果发现当前行与前一行内容完全相同,就会将多余的行删除。但若两行重复但未相邻(例如,中间夹杂其他内容),uniq
将无法识别,就像一位整理师无法跨过其他物品直接比较远处的重复书籍一样。
1.2 基础案例:直接去重
假设有一个名为 data.txt
的文件,内容如下:
apple
banana
apple
orange
apple
直接运行 uniq data.txt
后,输出结果为:
apple
banana
orange
这里,uniq
保留了第一个出现的 apple
,并删除了后续相邻的重复行。
1.3 直接读取标准输入
uniq
也可以通过管道从标准输入接收数据,例如:
echo -e "a\na\nb\na" | uniq
输出结果为:
a
b
二、uniq
命令的进阶选项与扩展功能
2.1 统计重复行的出现次数(-c
选项)
通过 -c
选项,uniq
可以在每行输出前添加该行的出现次数。例如:
echo -e "a\na\nb\na" | sort | uniq -c
输出结果为:
3 a
1 b
注意:这里需要先通过 sort
排序,否则 uniq
只会统计相邻行的重复次数。
2.2 仅保留唯一行(-u
选项)
使用 -u
选项时,uniq
会仅保留只出现一次的行。例如:
echo -e "a\na\nb\nc" | sort | uniq -u
输出结果为:
b
c
2.3 仅保留重复行(-d
选项)
通过 -d
选项,可以保留至少出现两次的行。例如:
echo -e "a\na\nb\nc" | sort | uniq -d
输出结果为:
a
三、uniq
命令的实战场景与组合技巧
3.1 与 sort
命令结合:处理非相邻重复数据
由于 uniq
只能处理相邻重复行,实际应用中通常需要先通过 sort
排序。例如,统计系统日志中某条错误信息的出现次数:
grep "error" /var/log/syslog | sort | uniq -c
此命令会先筛选包含 "error" 的日志行,排序后统计每条错误的出现次数。
3.2 指定比较列(-f
和 -s
选项)
若需按特定列去重,可以使用 -f
(跳过列数)和 -s
(起始列位置)选项。例如:
echo -e "apple 10\napple 20\nbanana 5" | uniq -f 1
输出结果为:
apple 10
banana 5
这里,-f 1
表示跳过第一列(数字列),仅根据第一列(水果名)去重。
3.3 处理二进制文件与特殊字符
uniq
也支持处理二进制文件,但需注意其默认使用 ASCII 码比较。若文件中包含特殊字符(如制表符),需确保处理方式正确。例如:
echo -e "a\t1\na\t2" | uniq
默认情况下,uniq
会将两行视为不同,因为空格与制表符的 ASCII 值不同。
四、常见误区与最佳实践
4.1 忽略排序导致的错误
误区:直接使用 uniq
处理未排序的文件,导致重复行未被删除。
解决方案:始终在 uniq
前添加 sort
,例如:
cat data.txt | sort | uniq
4.2 混淆 -u
和 -d
的作用
-u
保留唯一行,-d
保留重复行。例如,若需统计唯一用户登录次数:
cat /var/log/auth.log | awk '{print $NF}' | sort | uniq -u -c
此命令通过 awk
提取用户名,排序后仅统计未重复登录的用户。
4.3 结合 grep
实现复杂过滤
通过管道链,uniq
可与 grep
联合使用实现高级功能。例如,统计某个用户提交的 Git 提交次数:
git log --author="John" --pretty=oneline | uniq -c
五、高级技巧与扩展应用
5.1 自定义字段分隔符
默认情况下,uniq
以空格或制表符分割字段。若需自定义分隔符(如逗号),可结合 awk
处理:
echo -e "a,1\na,2" | awk -F ',' '{print $1}' | sort | uniq
此命令仅提取并去重第一列(以逗号分隔)。
5.2 处理多行记录
若文件包含多行记录(如日志中的连续行),可使用 paste
命令合并为单行后再处理:
paste - - - < data.txt | sort | uniq
5.3 与 cut
结合提取特定列
例如,统计 /etc/passwd
文件中不同 Shell 的使用次数:
cut -d ':' -f7 /etc/passwd | sort | uniq -c
此命令提取第七列(Shell 路径),排序后统计每种 Shell 的出现次数。
结论
uniq
命令作为 Linux 系统中轻量级的文本处理工具,凭借其简洁的语法和高效的性能,成为开发者日常工作的得力助手。通过结合 sort
、grep
、awk
等命令,它能够应对从简单去重到复杂数据分析的多样化场景。
掌握 uniq
命令不仅需要理解其基础功能,更要熟悉其与上下游命令的协作逻辑。建议读者通过实际案例反复练习,逐步将这些技巧融入日常开发与运维流程中。无论是优化日志分析效率,还是快速验证数据清洗结果,uniq
命令都将成为提升生产力的重要工具。
通过本文的深入讲解,希望读者能够全面掌握 uniq
命令的核心价值与应用场景,进而将其灵活运用到实际工作中,进一步提升 Linux 环境下的数据处理能力。