Chinaunix
标题:
统计日志中一个时间段内IP出现次数
[打印本页]
作者:
huarte
时间:
2013-04-08 14:20
标题:
统计日志中一个时间段内IP出现次数
116.10.64.137 - - [07/Apr/2013:00:32:30 +0800] "GET /hwssp/ HTTP/1.1" 304 -
171.106.49.84 - - [07/Apr/2013:00:32:30 +0800] "GET /hwssp/ HTTP/1.0" 200 89
180.142.204.5 - - [07/Apr/2013:00:32:30 +0800] "GET /hwssp/ HTTP/1.1" 200 89
222.217.75.242 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
113.14.64.254 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
180.143.217.219 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
113.13.45.147 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
113.14.64.215 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 304 -
113.14.64.254 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
180.143.217.219 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
180.142.206.56 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
113.13.45.147 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
116.8.97.181 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
113.14.64.215 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 304 -
180.143.217.219 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
113.14.64.254 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
复制代码
如上,有此类型日志,需要统计第一列IP的出现次数,并输出出现次数大于1000的IP,输出格式如下:
IP 地址 欻出现次数(按由大到小排列)
作者:
关阴月飞
时间:
2013-04-08 14:37
本帖最后由 关阴月飞 于 2013-04-08 14:37 编辑
awk '{a[$1]++}END{for(i in a)if(a[i] >1000)print i,a[i]}' urfile |sort -nrk2
复制代码
作者:
yestreenstars
时间:
2013-04-08 14:41
awk '{a[$1]++}END{for(i in a)if(a[i]>1000)print i,a[i]}' file | sort -k2nr
复制代码
排序还是要借助sort命令~
作者:
todayhero
时间:
2013-04-08 14:50
@huarte
[root@Wed ~]# awk '{a[$1]++}END{for(i in a){if(a[i]>2)print a[i],i}}' urfile | sort -k1nr
3 113.14.64.254
3 180.143.217.219
[root@Wed ~]# awk '{a[$1]++}END{for(i in a){if(a[i]>1000)print a[i],i}}' urfile | sort -k1nr
[root@Wed ~]#
复制代码
作者:
huarte
时间:
2013-04-08 16:39
回复
4#
todayhero
好用,多谢
作者:
V_客
时间:
2013-04-08 16:52
本帖最后由 V_客 于 2013-04-08 16:53 编辑
awk '{a[$1]+=1}END{l=asort(a,b);for(i=l;i>0;i--)for(k in a)print (a[k]==i && a[k]==3)?k"\t"i:"\b"}'
awk自带的排序 不过效率还不好就不知道了
复制代码
ps 那个3是我测试的 你改下
作者:
求上进
时间:
2013-04-10 14:38
todayhero 发表于 2013-04-08 14:50
@huarte
awk '{a[$1]++}END{for(i in a){if(a[i]>2)print a[i],i}}' t12 | sort -k1nr
复制代码
我的理解:
$1 表示打印第一列
$1=116.10.64.137,a[$1]=0,自加后为1;
$1=171.106.49.84,a[$1]=0,自加后为1;
$1=116.10.64.137,a[$1]=1,自加后为2;
$1=116.10.64.137,a[$1]=2,自加后为3;
依次类推 ....
当{a[$1]++}执行完成,即读取最后一行,再执行END后面的命令。
{a[$1]++}因为省略了前面的模式,所以对每一行都执行。
另,for(i in a)中的i指定从数组a中获取的下标,如116.10.64.137等。
涉及的知识点为awk的数组知识。
因为知识点不够,整整一天都在思考这行命令,也不知道理解的是否全面,但希望对于像我一样的新手有所帮助。
作者:
todayhero
时间:
2013-04-10 14:42
@求上进
$1 做为下标,只要遇到相同$1就递增加1,处理完后,通过END来读取数组里的内容
作者:
expert1
时间:
2013-04-11 21:32
回复
7#
求上进
您的理解是对的,论坛有精华帖对awk数组的总结。
作者:
coderjoy
时间:
2016-02-01 15:45
请问统计apache日志 访问网页文件的不包含js css 和图片,包含#baidu 的并且次数在5次以上的命令怎么写? awk '{a[$1]++}END{for(i in a)if(a[i] >1000)print i,a[i]}' urfile |sort -nrk2
作者:
我是一隻羊
时间:
2016-02-14 15:38
awk '{a[$1]++}END{for(i in a)printf a[i]>=2?i" "a[i]"\n":""|"sort -nrk2"}' urfile
复制代码
作者:
shouyu924
时间:
2016-02-18 22:14
awk '{print $1}' test.txt|sort|uniq -c |awk '$1>2{print $1,$2}'
复制代码
3 113.14.64.254
3 180.143.217.219
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2