打印出现次数最多的内容
要求打印 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地址。
*** 你必须十分努力,才能看起来毫不费力 ***