Linux系统之文本格式化工具awk(4)

wKioL1NBUuewy9plAAM3x595TEk537.jpg

⑵、 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文件的内容为一堆随机数。

 

wKiom1NBVgnBU7LNAAGmILMTeEw395.jpg

⑶、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;}'

 

wKioL1NBWG_xtDkzAACXmYb5hzw417.jpg

⑷、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

 

wKioL1NBXWKRYzc0AAD5TxxumaQ633.jpg

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

 

wKioL1NBXeCgrf5qAAEpX0g63i8513.jpg

⑸、 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

 

wKiom1NBXmiD0EOGAAE0y3S2_IQ501.jpg

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]}'

 

wKiom1NBX1ORZla4AAQyvcCHYtU318.jpg

⑵、 删除数组变量

从关系数组中删除数组索引需要使用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}}'

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15553.html