最近尝试用awk统计访问ip的次数,突然发现awk的数组是个无敌强大的存在,掌握好能让你如鱼得水。
1、awk 数组
在awk中,数组叫关联数组,与我们在其它编程语言中的数组有很大的区别。关联数组,简单来说,类似于python语言中的dict、java语言中的map,其下标不再局限于数值型,而可以是字符串,即下标为key,value=array[key]。竟然为key,那其下标也不再是有序的啦。
awk数组有以下几个特点:
- 数组无需提前定义,可以直接使用。例如 a[$1]++ ,因为 ++ 操作符,当key=$1 还没存在时,默认初始化 a[$1]=0,我们后面使用时就能体会这好处。
- 数组自动扩展。
- 下标可以是字符串。实际上 a[0]=a[“0”]。
2、遍历awk数组
for (key in array){print array[key]} // 遍历它的key 然后打印对应的值
3、几个常用函数
- 数组长度:length(array)
- 判断元素是否存在:if(key in array){ … }
- 删除元素:delete array[key]
- 删除数组:delete array
4、统计ip
nginx.accss.log:
118.249.144.105 - - [05/Apr/2016:09:06:29 +0800] "GET /ywr/http/common/Login?hostSessionId=1401cbdebe7a42db99e66319f782cea8 HTTP/1.1" "200" 73 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-N9002 Build/KOT49H)" "-" "" "0.79" 172.29.4.183:30074 730 465 "0.380"
118.249.144.106 - - [05/Apr/2016:09:06:29 +0800] "GET /ywr/http/common/Login?hostSessionId=1401cbdebe7a42db99e66319f782cea8 HTTP/1.1" "200" 73 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-N9002 Build/KOT49H)" "-" "" "0.79" 172.29.4.183:30074 730 465 "0.380"
118.249.144.105 - - [05/Apr/2016:09:06:29 +0800] "GET /ywr/http/common/Login?hostSessionId=1401cbdebe7a42db99e66319f782cea8 HTTP/1.1" "200" 73 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-N9002 Build/KOT49H)" "-" "" "0.79" 172.29.4.183:30074 730 465 "0.380"
118.249.144.105 - - [05/Apr/2016:09:06:29 +0800] "GET /ywr/http/common/Login?hostSessionId=1401cbdebe7a42db99e66319f782cea8 HTTP/1.1" "200" 73 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-N9002 Build/KOT49H)" "-" "" "0.79" 172.29.4.183:30074 730 465 "0.380"
118.249.144.107 - - [05/Apr/2016:09:06:29 +0800] "GET /ywr/http/common/Login?hostSessionId=1401cbdebe7a42db99e66319f782cea8 HTTP/1.1" "200" 73 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-N9002 Build/KOT49H)" "-" "" "0.79" 172.29.4.183:30074 730 465 "0.380"
118.249.144.107 - - [05/Apr/2016:09:06:29 +0800] "GET /ywr/http/common/Login?hostSessionId=1401cbdebe7a42db99e66319f782cea8 HTTP/1.1" "200" 73 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-N9002 Build/KOT49H)" "-" "" "0.79" 172.29.4.183:30074 730 465 "0.380"
118.249.144.108 - - [05/Apr/2016:09:06:29 +0800] "GET /ywr/http/common/Login?hostSessionId=1401cbdebe7a42db99e66319f782cea8 HTTP/1.1" "200" 73 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-N9002 Build/KOT49H)" "-" "" "0.79" 172.29.4.183:30074 730 465 "0.380"
awk代码,统计ip次数:
awk '{a[$1]++}END{for(i in a){print i,a[i]}}' nginx.access.log
5、番外
- 分隔符:awk默认的分隔符为空格,假如现需使用 “:” 作为分隔符,使用
awk -F ":"
- 原理:awk的主体部分{},就相当一个循环体,对输入一行一行处理,所以还会用到两个关键字 BEGIN 、END
- BEGIN:只在开始时执行一次
- END:只在结束时执行一次
完整的结构代码:
awk -F " " 'BEGIN{print "ip,count"}{a[$1]++}END{for(i in a){print i,a[i]}}' nginx.access.log