awk关联数组

最近尝试用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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值