“如何查询日志中有多少个IP登录?”,这是我之前面试百度实习生被问到的问题,当时因为没有什么经验也答得不好。因为最近经常有碰到类似的需求,所以令我又想起了这个问题。
如果IP在日志中的一行出现的位置是这样的:
"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
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!