Linux uniq 命令

Linux 命令大全

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

uniq 可检查文本文件中重复出现的行列。

语法

uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

参数

在linux开发过程中,我们经常会发现有很多重复的数据,如何处理这些重复的数据呢?

使用uniq 命令可以处理相关问题,我们先准备一些重复的数据,通过 cat 命令查看内容如下:

[root@iz8vbbxoyfcgyzkxcspg04z test]# cat t.txt
linux三剑客
grep
sed
sed
awk
awk
awk

目前 grep 没有重复,而 sedawk 都有重复。 

使用 uniq 命令删除文件中的连续重复行

如果你在不使用任何参数的情况下使用 uniq 命令,它将删除所有连续的重复行,只显示唯一的行。

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq t.txt  #删除重复行后的内容  
linux三剑客
grep
sed
awk

经过执行 uniq 命令删除了给定文件中的所有连续重复行,这是因为 uniq 命令只有在相邻的情况下才会删除重复的行,如果不是连续的数据能删除吗?

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq t2.txt
baidu.com
xinbiancheng.cn
google.cn
xinbiancheng.cn

注意:如果不是连续重复行,将不能删除重复的行,解决方案是对通过 sort 命令 对数据进行排序,使它变成连续的重复数据,即可删除重复行

uniq 命令 删除所有重复的行

[root@iz8vbbxoyfcgyzkxcspg04z test]# sort t2.txt | uniq
baidu.com
google.cn
xinbiancheng.cn

我们使用 sort 命令与 uniq 命令结合,已经没有重复行数据了,注意:除非重复行是相邻的,否则 uniq 不会删除它们

uniq -c 在每列旁边显示该行重复出现的次数

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq -c t.txt
      1 linux三剑客
      1 grep
      2 sed  #sed 命令重复了2次
      3 awk  #awk 命令重复了3次

uniq -d:多个重复的行只显示为一个重复行

请注意 -d(小写 d) 将会只打印重复的行,每组显示一个

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq -d t.txt 
sed #sed 重复了2次,只显现一次
awk #awk 重复了3次,只显现一次

uniq 使用-d -c 只统计重复行出现的次数。

[root@iz8vbbxoyfcgyzkxcspg04z test]# sort t.txt | uniq  -d -c
      3 awk
      2 sed

uniq -D:打印所有重复的行

请注意 -D(大写 D)

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq -D t.txt
sed
sed
awk
awk
awk

uniq -D不能和-c一起使用,否则会报错,报错信息如下:

[root@iz8vbbxoyfcgyzkxcspg04z test]# sort t.txt | uniq  -D -c #下面显示的是报错信息
uniq: printing all duplicated lines and repeat counts is meaningless
Try 'uniq --help' for more information.

uniq -u:显示没有重复值的行

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq -u t.txt
linux三剑客 #没有重复行
grep       #没有重复行

uniq -i:忽略大小写

准备数据,文件名为 i.txt,内容如下:

[root@iz8vbbxoyfcgyzkxcspg04z test]# cat i.txt
A
a
A
bb
Bb

以上内容分别有大写的A和小写的a,以及bb和Bb大小写组合,当带上参数 -i 时忽略大小写

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq -i i.txt
A
bb

uniq -f:跳过多少个字段(field)开始比较重复值

[root@iz8vbbxoyfcgyzkxcspg04z test]# cat log.txt
xinbiancheng.cn 6
jd.com 6
baidu.com 1
google.cn 3

第1,2行中的,第2字段6是重复的。默认是比较第1字段。如何跳到第二个字段呢?使用参数 -f 1,就跳到第2字段了,代码如下:

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq -f 1 log.txt
xinbiancheng.cn 6
baidu.com 1
google.cn 3

uniq -w 将比较限制为 N 个字符

准备的测试数据如下:

[root@iz8vbbxoyfcgyzkxcspg04z test]# cat t1.txt
111aaa
222aaa
222bbb
333aaa

我们可以使用 -w 选项来限制对文件中特定数量字符的比较。例如,让我们比较文件中的前3个字符,并显示重复行,如下所示:

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq -d -w 3 t1.txt
222aaa

222aaa 和 222bbb 前3位都是222,所以它们是重复项,重复行是222aaa

uniq -s 忽略比较指定的 N 个字符

像对文件中行的前 N 个字符进行限制比较一样,我们也可以使用 -s 选项来忽略比较前 N 个字符。

下面的命令将忽略在文件中每行的前3个字符进行比较:

[root@iz8vbbxoyfcgyzkxcspg04z test]# uniq -d -s 3 t1.txt
111aaa

111aaa 和 222aaa 忽略前3位222,就相当于比较aaa 和 aaa,所以重复行是111aaa

Linux 命令大全