Linux uniq 命令(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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 系统中轻量级的文本处理工具,凭借其简洁的语法和高效的性能,成为开发者日常工作的得力助手。通过结合 sortgrepawk 等命令,它能够应对从简单去重到复杂数据分析的多样化场景。

掌握 uniq 命令不仅需要理解其基础功能,更要熟悉其与上下游命令的协作逻辑。建议读者通过实际案例反复练习,逐步将这些技巧融入日常开发与运维流程中。无论是优化日志分析效率,还是快速验证数据清洗结果,uniq 命令都将成为提升生产力的重要工具。


通过本文的深入讲解,希望读者能够全面掌握 uniq 命令的核心价值与应用场景,进而将其灵活运用到实际工作中,进一步提升 Linux 环境下的数据处理能力。

最新发布