一、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语句中