数组:一个个元素按一定顺序排列的集合。
一.定义方法
1.可以用数值做数组索引(下标)
array[1]=”oldboy”
array[2]=”oldgirl”
2.可以用字符串作数组索引(下标)
array_oldboy[”one”]=”oldboy trainging”
array_oldboy[”two”]=”welcome”
array_oldboy[”three”]=”test”
3打印数组:
awk ’BEGIN{ array[1]=”oldboy”;array[2]=”oldgirl”;for(keyin array) print key,array[key]} ’
写成脚本:vi t1.awk
#!/bin/awk
BEGIN{
array[1]=”oldboy”;
array[2]=”oldgirl”;
for(key in array)
print key,array[key];
}
执行:awk –f t1.awk
awk ’BEGIN{ array[1]=”oldboy”;array[2]=”oldgirl”;}END{for(keyin array) print key,array[key]} ’ /etc/hosts
提供BEGIN和END的作用是给程序赋予初始状态和程序结束之后执行一些扫尾工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
或:cat/etc/hosts| awk ’BEGIN{ array[1]=”oldboy”;array[2]=”oldgirl”;}END{for(key inarray) print key,array[key]} ’
把文件内容第一列作为下标k,第二列作为值S[k],放入数组S[]然后输出
cat /etc/hosts| awk ’BEGIN{ array[1]=”oldboy”;array[2]=”oldgirl”;}END{for(keyin array) print key,array[key]} ’>t3.log
cat t3.log
awk ’{S[$1]=$2}END{for(k in S) print k,S[k]}’ t3.log
cat t3.log
案例1:处理以下文件内容,将域名取出并根据域名进行计数排序处理
oldboy.log
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
cut –d / -f3 oldboy.log|sort –r|uniq –c
awk –F ”/” ’ {S[$3]= S[$3]+1}END{for (k in S) printk,S[k]}’ oldboy.log|sort –rn –k2|head 10
案例2:统计web日志单ip访问请求数排名
access-test.log
awk ’{S[$1]++}END{for( k in S ) printk,S[k]}’ access-test.log|sort –rn –k2|head
awk ’{print $1}’ access-test.log |sort|uniq–c|sort –rn |head
案例3:统计企业中高并发web服务器不同网络连接状态对应数量
nerstat.log
awk ’/^tcp/ {S[$NF]++}END{for(k in S) printS[k],k}’ netstat.log|sort –rn|head
awk ’/^tcp/ {print $NF}’netstat.log|sort|uniq –c|sort –rn|head