Linux中的uniq
命令是一个用于处理文本文件中相邻重复行的实用工具,它的名称来源于“unique”(唯一)的缩写,主要用于从输入中删除或标识重复的相邻行,虽然uniq
命令看似简单,但结合其他命令(如sort
)可以发挥强大的去重功能,本文将详细介绍uniq
命令的语法、选项、实际应用场景,并通过示例帮助读者全面掌握其用法。

uniq
命令的基本语法为uniq [选项] [输入文件 [输出文件]]
,如果不指定输入文件,默认从标准输入读取;如果不指定输出文件,默认输出到标准输出,需要注意的是,uniq
命令仅处理相邻的重复行,因此如果需要处理文件中所有重复行(包括非相邻的),通常需要先使用sort
命令对文件进行排序,这一点是uniq
命令与去重相关的其他命令(如sort -u
)的重要区别。
uniq
命令的常用选项包括以下几种:
-c
或--count
:在每行行首显示该行在文件中出现的次数;-d
或--repeated
:仅显示重复出现的行;-D
或--all-repeated[=delimit-method]
:显示所有重复行,可选择以空行或指定符号分隔重复组;-u
或--unique
:仅显示不重复的行;-f
或--skip-fields=N
:跳过前N个字段进行比较;-i
或--ignore-case
:忽略大小写进行比较;-s
或--skip-chars=N
:跳过前N个字符进行比较;-w
或--check-chars=N
:仅比较前N个字符;-z
或--zero-terminated
:以空字符作为行分隔符而非换行符;--help
:显示帮助信息;--version
:显示版本信息。
以下通过具体示例说明uniq
命令的用法,假设有一个名为test.txt
的文件,内容如下:
apple
banana
apple
orange
banana
apple
直接运行uniq test.txt
,输出结果为:

apple
banana
orange
apple
可以看到,uniq
命令仅删除了相邻的重复行(第二行和第三行的apple
),但保留了非相邻的重复行(第一行和第五行的apple
),若需完全去重,需先使用sort
命令:sort test.txt | uniq
,输出结果为:
apple
banana
orange
使用-c
选项可以统计每行出现的次数,例如uniq -c test.txt
的输出为:
1 apple
1 banana
1 apple
1 orange
1 banana
1 apple
若需统计全局重复次数,可结合sort
:sort test.txt | uniq -c
,输出为:
3 apple
2 banana
1 orange
-d
选项仅显示重复行,例如uniq -d test.txt
输出为:

apple
banana
而-u
选项仅显示不重复行,uniq -u test.txt
输出为:
orange
-f
选项用于跳过字段比较,假设test2.txt
内容为:
1 apple
2 banana
1 apple
3 orange
2 banana
4 apple
运行uniq -f 1 test2.txt
(跳过第一个字段比较),输出为:
1 apple
2 banana
3 orange
4 apple
此时uniq
仅根据第二个字段去重,而忽略第一个字段。
-i
选项忽略大小写,例如test3.txt
内容为:
Apple
banana
apple
Orange
BANANA
运行uniq -i test3.txt
,输出为:
Apple
banana
Orange
可以看到Apple
和apple
被视为相同行,banana
和BANANA
也被视为相同行。
uniq
命令在日志分析、数据清洗等场景中非常实用,分析服务器日志时,可以使用sort access.log | uniq -c | sort -nr
统计访问频率最高的IP地址;在处理CSV文件时,可通过uniq -f 1 data.csv
去除基于某一字段的重复行。
需要注意的是,uniq
命令对输入文件的顺序有严格要求,仅处理相邻行,在实际应用中,通常需要先通过sort
命令对文件进行排序,以确保所有重复行相邻。uniq
命令默认区分大小写,若需忽略大小写,需使用-i
选项。
以下是一个综合示例:假设有一个包含用户登录信息的日志文件login.log
如下:
user1 192.168.1.1
user2 192.168.1.2
user1 192.168.1.1
user3 192.168.1.3
user2 192.168.1.2
若需统计每个用户的登录次数,可运行:
sort login.log | uniq -c | sort -nr
输出结果为:
2 user1 192.168.1.1
2 user2 192.168.1.2
1 user3 192.168.1.3
若需仅显示重复登录的用户,可运行:
sort login.log | uniq -d
输出结果为:
user1 192.168.1.1
user2 192.168.1.2
相关问答FAQs:
-
问:
uniq
命令和sort -u
命令有什么区别?
答:uniq
命令仅删除相邻的重复行,而sort -u
命令会先对文件进行排序,然后删除所有重复行(包括非相邻的)。sort -u
可以实现全局去重,而uniq
仅处理相邻重复行,对于文件内容为b\na\nb
,uniq
输出为b\na\nb
,而sort -u
输出为a\nb
。 -
问:如何使用
uniq
命令统计文件中每个单词的出现次数?
答:可以通过结合tr
、sort
和uniq
命令实现,统计file.txt
中每个单词的出现次数,可运行:tr ' ' '\n' < file.txt | sort | uniq -c | sort -nr
,该命令首先将空格替换为换行符(将单词分行),然后排序,再用uniq -c
统计次数,最后按次数降序排列。