在查看日志中我们会有很多重复的行,为了方便分析需要去重后进行统计或者查看分析,这个时候就需要使用去重,这里说一下去重使用的命令uniq。
uniq的参数:
-c, --count 在每行前加上表示相应行目出现次数的前缀编号
-d, --repeated 只输出重复的行
-D, --all-repeated[=delimit-method 显示所有重复的行
delimit-method={none(default),prepend,separate}
以空行为界限
-f, --skip-fields=N 比较时跳过前N 列
-i, --ignore-case 在比较的时候不区分大小写
-s, --skip-chars=N 比较时跳过前N 个字符
-u, --unique 只显示唯一的行
-z, --zero-terminated 使用'\0'作为行结束符,而不是新换行
-w, --check-chars=N 对每行第N 个字符以后的内容不作对照
--help 显示此帮助信息并退出
--version 显示版本信息并退出
我们创建一个有重复行的文件,然后针对文件进行去重处理
[root@localhost wulaoer]# cat wulaoer.txt
2 python3 800 Jan
6 DevOps 300 May
1 Linux 1200 Mar
5 redis 100 Sept
5 redis 100 Sept
4 golong 800 Oct
6 DevOps 300 May
6 DevOps 300 May
3 Ruby 200 Dec
5 redis 100 Sept
4 golong 800 Oct
5 redis 100 Sept
3 Ruby 200 Dec
uniq默认是删除连续的重复行,而不是删除整个文件中有重复的行,这两个概念不一样要分清
[root@localhost wulaoer]# uniq wulaoer.txt
2 python3 800 Jan
6 DevOps 300 May
1 Linux 1200 Mar
5 redis 100 Sept
4 golong 800 Oct
6 DevOps 300 May
3 Ruby 200 Dec
5 redis 100 Sept
4 golong 800 Oct
5 redis 100 Sept
3 Ruby 200 Dec
参数'-c'是查找连续出现的行的数量不是找整个文件出现重数
[root@localhost wulaoer]# uniq -c wulaoer.txt
1 2 python3 800 Jan
1 6 DevOps 300 May
1 1 Linux 1200 Mar
2 5 redis 100 Sept
1 4 golong 800 Oct
2 6 DevOps 300 May
1 3 Ruby 200 Dec
1 5 redis 100 Sept
1 4 golong 800 Oct
1 5 redis 100 Sept
1 3 Ruby 200 Dec
如果想找文件中所有重复行需要先对文件进行一下排序,排序后的字符串是连续的,就可以进行去重了,下面使用‘-d’参数查看重复的行。
[root@localhost wulaoer]# sort wulaoer.txt | uniq -d
3 Ruby 200 Dec
4 golong 800 Oct
5 redis 100 Sept
6 DevOps 300 May
使用'-D'参数显示所有重复的行。
[root@localhost wulaoer]# sort wulaoer.txt | uniq -D
3 Ruby 200 Dec
3 Ruby 200 Dec
4 golong 800 Oct
4 golong 800 Oct
5 redis 100 Sept
5 redis 100 Sept
5 redis 100 Sept
5 redis 100 Sept
6 DevOps 300 May
6 DevOps 300 May
6 DevOps 300 May
使用'-u'显示只出现一次的行
[root@localhost wulaoer]# sort wulaoer.txt | uniq -u
1 Linux 1200 Mar
2 python3 800 Jan
统计出现重复行的行数
[root@localhost wulaoer]# sort wulaoer.txt | uniq -c | sort -rn
4 5 redis 100 Sept
3 6 DevOps 300 May
2 4 golong 800 Oct
2 3 Ruby 200 Dec
1 2 python3 800 Jan
1 1 Linux 1200 Mar
以上是比较常用的参数,其他参数不太常用,而且在以后的工作中不太建议使用uniq,因为uniq使用必须依靠sort排序才方便去重。