菜鸟科技网

Linux uniq命令如何正确使用及参数详解?

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

Linux uniq命令如何正确使用及参数详解?-图1
(图片来源网络,侵删)

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,输出结果为:

Linux uniq命令如何正确使用及参数详解?-图2
(图片来源网络,侵删)
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

若需统计全局重复次数,可结合sortsort test.txt | uniq -c,输出为:

    3 apple
    2 banana
    1 orange

-d选项仅显示重复行,例如uniq -d test.txt输出为:

Linux uniq命令如何正确使用及参数详解?-图3
(图片来源网络,侵删)
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

可以看到Appleapple被视为相同行,bananaBANANA也被视为相同行。

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

  1. 问:uniq命令和sort -u命令有什么区别?
    答:uniq命令仅删除相邻的重复行,而sort -u命令会先对文件进行排序,然后删除所有重复行(包括非相邻的)。sort -u可以实现全局去重,而uniq仅处理相邻重复行,对于文件内容为b\na\nbuniq输出为b\na\nb,而sort -u输出为a\nb

  2. 问:如何使用uniq命令统计文件中每个单词的出现次数?
    答:可以通过结合trsortuniq命令实现,统计file.txt中每个单词的出现次数,可运行:tr ' ' '\n' < file.txt | sort | uniq -c | sort -nr,该命令首先将空格替换为换行符(将单词分行),然后排序,再用uniq -c统计次数,最后按次数降序排列。

分享:
扫描分享到社交APP
上一篇
下一篇