打印出现次数最多的内容

要求打印 last 命令中,出现次数最多的IP地址

方法一:

last | awk  '/([0-9]{1,3}\.){3}[0-9]{1,3}/{i=++a[$3];if(max < i) {max=i; ip=$3}} END{ print ip}'

 

方法二:

last | awk '$3~"^([0-9]+.)+[0-9]+$"{a[++b[$3]]=$3}END{print a[length(a)]}

利用动态正则来匹配IP地址,然后以IP地址为下标记数,再把这个结果作为数组a的下标,那么必然数组a的下标为 1、2、3、4、5...一直累加,最后用length()函数取出数组的长度,也就是下标的个数,最大的那个下标的值即是出现次数最多的IP地址

执行过程分析:
假如有ip1, ip2, ip3几个ip地址
刚开始执行时,a[++b[ip1]] ==> a[1]=ip1
如果下一行是ip2,则a[++b[ip2]] ==> a[1]=ip2,即把前面的a[1]的值替换成ip2
...
所以,执行到最后,保留的一定是出现次数最多的ip地址。

 

posted @ 2020-05-21 16:22  bigtree2pingping  阅读(115)  评论(0编辑  收藏  举报