猿问

如何通过命令行统计和排列访问日志里的ip数

有没有什么命令可以做这样一件事
把accesslog里的ip统计出来,每个ip的数量,然后按照数量倒序排列
慕姐8265434
浏览 485回答 2
2回答

婷婷同学_

以下的方式速度都会卡在sort上面,数量越多越麻烦。Shell方法:grep-i-o-E-r-e"([0-9]{1,3}\.){3}[0-9]{1,3}"access.log|sort-n|uniq-c|sort-nawk方法:如果是accesslog格式应该是固定的会简单些。因为awk做排序也比较的郁闷,所以暂时用sort吧。awk'{if($1~/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){ip[$1]++}}END{for(iinip){printip[i],"\t",i}}'|sort-n如果是无序的没有规律的格查找ip,可以参考下面这段代码,可能还有需要优化的地方,像正则就不能够这样写。/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{s=$0;idx=1;for(;;){idx=match(s,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/,a);if(idx==0){break;}seg[a[0]]++;s=substr(s,idx+1);}}END{for(iinseg){printi"\t"seg[i];}}Notice:对于量小的log以上的方法都可以,但是涉及到真的大的log,就会需要考虑其它的方式了。

梵蒂冈之花

1、首先注意在日志文件中,可能会出现包含了访问源的IP地址和目标IP地址,应注意需要统计的是前者或者后者,排除掉不需要统计的地址。以统计的IP地址在第1列为例:awk'{print$1}'web.log2、下面以apache的访问日志为例:awk'{print$1}'web.log|grep-E"([0-9]{1,3}\.){3}[0-9]{1,3}"|sort|uniq-c|sort-g1192.168.10.151192.168.1.1291192.168.1.193192.168.1.294192.168.1.1396192.168.10.57192.168.1.929192.168.1.1193、如果是access.log的格式,IP地址是固定在某列,用Awk的数组,速度是最快的:awk'{aaa[$1]++;}END{for(iinaaa){printf("%s\t%s\n",aaa[i],i);}}'./access.log|sort-bn
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答