shell复习—统计重复ip地址次数

今天在复习shell的过程中,想起来之前遇到过的一道面试题,如何去除两个文件中的重复数据?
我的第一反应就是用 uniq

cat file1 file2|sort|uniq > resultfile

当然这个回答上来面试官就会继续往下问扩展内容,其实也是日常工作中经常遇到的。
log文件中记录访问信息,里面包含ip地址等信息,想统计每个ip地址访问的次数
(我老板在面试别人的时候也很喜欢面这道题😅😅😅每次我坐在旁边的时候一直都在想,我能不能写出来)
先思考一下最简单的处理情况,log中的格式是固定的,ip地址出现在第三列。
eg:

cat test.log
POST 200 192.168.1.1
POST 200 192.168.10.1
POST 200 192.168.1.1
POST 200 192.168.20.1
awk -F" " '{print $3}' text.log|sort |uniq -c|sort -n -r|head -n 5

取出ip地址所在的第三列,排序才能去重,-c记录出现次数,sort -r 表示从大到小 -n表示按数值排序,head -n 5 取top5

然后如果这个答上来,还有可能的进一步的扩展就是,当前的日志文件并不是有很好的格式化,不一定都在相同列
这时候怎么办?那就是用正则筛选出来ip,然后后面的操作应该是一样。
ip地址的正则表达式

'[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' test.log|sort |uniq -c|sort -n -r|head -n 5 

-E 是扩展正则表达式,也可以直接用egrep

grep的正则比较好懂,我一直感觉的sed的正则好难记,一般在面向Google编程的时候才用

sed -nr 's/.*[^0-9](([0-9]+\.){3}[0-9]+).*/\1/p' test.txt|sort |uniq -c|sort -n -r|head -n 5 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值