⑵、 while
语法:
while (condition){statement1; statment2; ...}
实例:
1 2 3 4
#awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd #awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}' /etc/passwd #awk '{i=1;while (i<=NF) {if ($i>=20000) print $i; i++}}' random.txt #random.txt文件的内容为一堆随机数。
⑶、do-while 至少执行一次循环体,不管条件满足与否
语法:
do {statement1, statement2, ...} while (condition)
实例:
1 2 3 4 5 6 7 8
#awk 'BEGIN{ sum=0; i=0; do{ sum+=i; i++; }while(i<=100) print sum;}'
⑷、for
语法:for ( variable assignment; condition; iteration process) { statement1, statement2, ...}
实例:
1
#awk -F: '{for(i=1;i<=3;i++) { if (length($i)>=8) {print $i}}}' /etc/passwd
for循环还可以用来遍历数组元素:
语法:
for (i in array) {statement1, statement2, ...}
实例:
1
#awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%-15s:%i\n",A,BASH[A]}}' /etc/passwd
⑸、 case
语法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}
⑹、 break 和 continue
常用于循环或case语句中
⑺、 next
提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:
实例:
1
# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd
9、awk中使用数组
⑴、 数组
array[index-expression]
index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。
要遍历数组中的每一个元素,需要使用如下的特殊结构:
语法
for (var in array) { statement1, ... }
其中,var用于引用数组下标,而不是元素值;
实例:
1
#netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
⑵、 删除数组变量
从关系数组中删除数组索引需要使用delete命令。使用格式为:
delete array[index]
10、awk的内置函数
split(string, array [, fieldsep [, seps ] ])
功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从1开始的序列;
实例:
1 2 3
# netstat -ant | awk '/:80\>/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50 # netstat -tan | awk '/:80\>/{split($5,clients,":");ip[clients[4]]++}END{for(a in ip) print ip[a],a}' | sort -rn | head -50 # df -lh | awk '!/^File/{split($5,percent,"%");if(percent[1]>=20){print $1}}'