一、awk流程控制
1.分支结构
if
语法 单分支-if(判断){指令}
双分支-if(判断){指令}else{指令}
多分支-if(判断){指令}else if(判断){指令}else{指令}
例子 监控某网卡收发流量
ifconfig eth0 |awk ‘BEGIN{print "接收流量","发送流量"}/bytes/{if($1=="RX"){x=$5}else{y=$5}}END{print x,y}‘
思路 先将接收和发送流量对应的列找出来,因为在同一列,要打印出不同的值,需要增加条件,分别用不同的变量储存那一列的值
2.循环结构
while
语法 while(判断){指令}
例子(求词频)
1)统计/etc/passwd下的root有多少个
awk -F: ‘{i=1;while(i<=NF){if($i~/root/){x++};i++}}END{print x}‘ /etc/passwd
思路 先写结构,再写循环,最后组合;用一个变量遍历列做循环,用一个变量记录root
结构: awk -F: ‘{}‘ /etc/passwd
循环:
i=1
while(i<=NF){
if($i~/root/){x++}
i++
}
#i负责每行(awk为逐行处理)循环的次数
#将i与列数NF比较,每一列循环一次,直到该行的每一列参数都取遍
#i在第一列的参赛中是否包含root(模糊匹配),是则x+1(x默认0)
二、awk数组
1.定义数组
给数组赋值
格式 :数组名[下标]=元素名
例子 :
awk ‘BEGIN{a[0]=11;a[1]=22}‘
awk ‘{IP[$n]}‘
#数组中未定义的变量,如 a[2] 的值也是默认为0
#将每行第n列的参数分别读入数组IP的[ ]中,作为数组IP的元素『常用作统计某文件里每个IP(或者名字之类)(都在某一列)出现了多少次』
2.遍历数组
用for实现
格式:for(变量 in 数组名){print 数组名[变量]}
例子 找出攻击者
awk ‘{IP[$1]++}
END{for(i in IP){print i,IP[i]}}‘
/var/log/httpd/access_log
| awk ‘$1>100{print $2}‘
#读取的不同IP视为数组IP中的不同元素,IP[$1]++即统计每个元素出现的次数(每个元素初值为0,每读一个IP该元素的值+1)
#在结尾处插入for循环『给 i 赋值为数组IP的不同下标(下标必须由数字组成,可以是IP)』,每当i取一个下标,打印该下标(即IP)和该下标对应的元素的值(出现次数)
#注:用for循环对数组的下标取值操作貌似只能用在awk语句中
原文地址:http://blog.51cto.com/13455186/2065617