本文共 1188 字,大约阅读时间需要 3 分钟。
一、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语句中转载于:https://blog.51cto.com/13455186/2065617