awk 数组理解与应用


awk 数组无须实现定义

ckl[abc]=6

ckl[xyz]=9


abc 为下标名称

9 则为下标对应的值


BEGIN 为模式前匹配,即为匹配之前操作

END 为模式匹配后,即为匹配后操作


如常用的统计TCP状态的awk命令

# netstat -ant | awk '/^tcp/{STA[$NF]++}END{for ( k in STA) {print k,STA[k]}}'

TIME_WAIT 4

CLOSE_WAIT 19

FIN_WAIT2 1

ESTABLISHED 135

LAST_ACK 2

LISTEN 21

/^tcp/ 匹配以tcp开头的

STA 定义一个数组

$NF 为最后一个字段

STA[$NF]++ 将最后一个字段内容加入到数组中,最后一个字段内容为下标,如果相同则递加

END 定义匹配后的操作

for ( k in STA)  定义k为变量,循环数组STA

print k,STA[k] 打印下标的内容和数组对于下标的值


如统计nginx 访问ip的统计量

# cat access.log 

58.49.184.16 - - [15/Jan/2014:15:40:12 +0800] "GET /zh_CN/dragonball/announcement.xml HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"

58.49.184.16 - - [15/Jan/2014:15:40:14 +0800] "GET /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"

58.49.184.16 - - [15/Jan/2014:15:41:07 +0800] "GET /zh_CN/dragonball/ HTTP/1.1" 403 570 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"

58.49.184.16 - - [15/Jan/2014:15:41:14 +0800] "GET /zh_CN/ HTTP/1.1" 403 570 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"


执行命令

# cat access.log | awk '{ACC[$1]++}END{for (c in ACC) {print c,ACC[c]}}'

58.49.184.16 6


ACC 定义数组

$1 第一个字段为下标,即IP

ACC[$1]++ 定义ACC数组,ip为数组下标,如IP相同则递加,下标对应的值为递加后的结果

print c,ACC[c] 打印IP及IP为下标的数组的内容


你可能感兴趣的:(awk)