Chinaunix

标题: 统计日志中一个时间段内IP出现次数 [打印本页]

作者: huarte    时间: 2013-04-08 14:20
标题: 统计日志中一个时间段内IP出现次数
  1. 116.10.64.137 - - [07/Apr/2013:00:32:30 +0800] "GET /hwssp/ HTTP/1.1" 304 -
  2. 171.106.49.84 - - [07/Apr/2013:00:32:30 +0800] "GET /hwssp/ HTTP/1.0" 200 89
  3. 180.142.204.5 - - [07/Apr/2013:00:32:30 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  4. 222.217.75.242 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  5. 113.14.64.254 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  6. 180.143.217.219 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  7. 113.13.45.147 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  8. 113.14.64.215 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 304 -
  9. 113.14.64.254 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  10. 180.143.217.219 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  11. 180.142.206.56 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  12. 113.13.45.147 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  13. 116.8.97.181 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  14. 113.14.64.215 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 304 -
  15. 180.143.217.219 - - [07/Apr/2013:00:32:31 +0800] "GET /hwssp/ HTTP/1.1" 200 89
  16. 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 编辑
  1. 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
  1. 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
  1. [root@Wed ~]# awk '{a[$1]++}END{for(i in a){if(a[i]>2)print a[i],i}}' urfile | sort -k1nr
  2. 3 113.14.64.254
  3. 3 180.143.217.219
  4. [root@Wed ~]# awk '{a[$1]++}END{for(i in a){if(a[i]>1000)print a[i],i}}' urfile | sort -k1nr
  5. [root@Wed ~]#
复制代码

作者: huarte    时间: 2013-04-08 16:39
回复 4# todayhero


    好用,多谢
作者: V_客    时间: 2013-04-08 16:52
本帖最后由 V_客 于 2013-04-08 16:53 编辑
  1. 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"}'
  2. awk自带的排序 不过效率还不好就不知道了
复制代码
ps 那个3是我测试的 你改下
作者: 求上进    时间: 2013-04-10 14:38
todayhero 发表于 2013-04-08 14:50
@huarte
  1. 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
  1. 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
  1. awk '{print $1}' test.txt|sort|uniq -c |awk '$1>2{print $1,$2}'
复制代码
  1. 3 113.14.64.254
  2. 3 180.143.217.219
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2