如何查询日志中有多少个IP登录

“如何查询日志中有多少个IP登录?”,这是我之前面试百度实习生被问到的问题,当时因为没有什么经验也答得不好。因为最近经常有碰到类似的需求,所以令我又想起了这个问题。

如果IP在日志中的一行出现的位置是这样的:

1
"time":"2021-08-16T18:28:02.187","ip":"127.0.0.1"

如果只是grep ip那还好说,但是一个IP在日志中出现的次数可能超过一次,所以需要去重,在Linux中去重的命令是uniq,但是又因为uniq去重需要排序,所以需要先给IP排一下序。于是我们的命令可以这样写:grep ip|awk -F “,” ‘{print $2}’ | sort | uniq |wc -l

这样就把所有登录的IP的次数统计出来了。

但是还没完,这个时候假如产品经理又提了个需求:怎么统计出昨天上线,但是今天没上线的IP。这个时候你该怎么做呢?

先把昨天上线的IP通过上面的方法输出到文件ip1.txt中,然后把今天上线的IP用同样的方法输出到ip2.txt中。然后用命令sort ip1.txt ip2.txt ip2.txt|uniq -u,这句命令的意思是给ip1.txt和两个ip2.txt组成的内容做排序,然后取出只出现一次的内容,由于ip2.txt出现了两次,所以里面的内容肯定不会输出到最后结果中,如果同时出现在ip1.txt和ip2.txt的也不会出现在最后结果中,所以最后就输出了只在ip1.txt中出现的内容,也就是在昨天登录但是没在今天登录的IP。

但是产品经理还没有满足,他又提了两个需求,第一个:求出昨天和今天都有登录的IP;第二个:求出昨天和今天总共有哪些IP登录了。

第一个实现如下:sort ip1.txt ip2.txt | uniq -d

第一个实现如下:sort ip1.txt ip2.txt | uniq

其实我们稍微总结一下就知道这三个需求其实是求ip1.txt和ip2.txt的差集、交集、并集。

于是我们有了求两个文件差集、交集、并集的通用方法:

差集

sort ip1.txt ip2.txt ip2.txt | uniq -u

交集

sort ip1.txt ip2.txt | uniq -d

并集

sort ip1.txt ip2.txt | uniq


如何查询日志中有多少个IP登录
https://www.chuckfang.com/2021/08/16/sort-uniq/
作者
方程
发布于
2021年8月16日
许可协议