uniq命令的使用
uniq命令:
一、 介绍
uniq对指定的ASCII文件或标准输入进行唯一性检查,以判断文本文件中重复出现的行。常用于系统排查及日志分析。
二、 命令格式:
uniq [options] [ file1 [file2] ]
uniq从已经排序好的文本文件file1中删除重复的行,输出到标准输出或file2。常作为过滤器,配合管道使用。
在使用uniq命令前,必须确保操作的文本文件已经过sort排序。若不带参数运行uniq,将删除重复的行。
三、 常见参数:(只记-c就行,其它的参数只做了解)
-c,--count***** (比较常用)
在每行旁边显示该行重复出现的次数
-d, --repeated
仅显示重复出现两次或两次以上的行,默认的去重包含1次。
-D, --all –repeated[=method]
以指定的格式打印所有重复的行。格式仅使用于长选项参数,可使用none(默认),prepend,separate三个,效果见后面。以空行进行区分。
-f n, --skip-fields=n
前n个字段与每个字段前的空白一起被忽略。一个字段(fields)是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从1开始编号),与-n相同,n为字段数。
-i , --ignore-case
在判断重复行时,忽略大小写区别
-s n,--skip-chars=n
前n个字符被忽略,之前的字符被跳过(字符从1开始编号)。与+n相同,n为字符数。
-u, --unique
仅显示出现一次的行
-w n, --check-chars=n
仅比较每行前面n个字符
--help
显示帮助信息
--version
显示版本信息
【输入文件】
已经排序好的文本文件或标准输入
【输出文件】
指定的输出文件,若不指定,则显示在屏幕上
结论:uniq只能对相邻的相同行内容去重。因此,在去重之前要先用sort进行排序,目的是让相同的内容相邻,好实现完全去重。
测试数据
10.0.0.9
10.0.0.8
10.0.0.7
10.0.0.7
10.0.0.8
10.0.0.8
10.0.0.9
[root@localhost shell]# cat oldboy.txt
10.0.0.9
10.0.0.8
10.0.0.7
10.0.0.7
10.0.0.8
10.0.0.8
10.0.0.9
a.只对相邻的相同行的内容去重。
[root@localhost shell]# uniq oldboy.txt
10.0.0.9
10.0.0.8
10.0.0.7
10.0.0.8
10.0.0.9
b. sort命令让重复的行相邻
[root@localhost shell]# sort oldboy.txt
10.0.0.7
10.0.0.7
10.0.0.8
10.0.0.8
10.0.0.8
10.0.0.9
10.0.0.9
c.uniq配合sort去重
[root@localhost shell]# sort -u oldboy.txt
10.0.0.7
10.0.0.8
10.0.0.9
sort去重功能
[root@localhost shell]# sort oldboy.txt | uniq
10.0.0.7
10.0.0.8
10.0.0.9
d.去重计数
[root@localhost shell]# sort oldboy.txt | uniq -c
2 10.0.0.7
3 10.0.0.8
2 10.0.0.9
企业案例:
处理一下文件内容,将域名取出并根据域名进行计数排序处理:(百度和souhu面试题)
oldboy.log
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
解答:
分析:此类问题是运维工作中最常见的问题。可以演变成分析日志,查看TCP各个状态连接数,查看单IP连接数排名等等
[root@localhost shell]# cat oldboy.log
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
第一种方法:
[root@localhost shell]# awk -F / '{print $3}' oldboy.log | sort -r| uniq -c //去重,以倒序的方式计数
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org
第二种方法:
[root@localhost shell]# cut -d / -f3 oldboy.log | sort -r|uniq -c
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org
第三种方法:
[root@localhost shell]# awk -F "/" '{S[$3]++}END{for(k in S) print k,S[k]}' oldboy.log |sort -rn -k2
www.etiantian.org 3
post.etiantian.org 2
mp3.etiantian.org 1