首页 awk 流程控制(四)

awk 流程控制(四)

技术张儿 2018-9-20 0 194
标签: Linux·awk

1)if语句

单分支

[root@jz ~]# seq 5|awk '{if($0==3)print $0}'
3

双分支

[root@jz ~]# seq 5|awk '{if($0==3)print $0;else print "no"}'
no
no
3
no
no

多分支
[root@jz ~]# cat file 
1 2 3
4 5 6
7 8 9
[root@jz ~]# awk '{if($1==4){print "1"} else if($2==5){print "2"} else if($3==6){print "3"} else {print "no"}}' file
no
1
no

2)while语句
遍历打印所有字段(awk是按行处理的,每次读取一行,并遍历打印每个字段)
[root@jz ~]# awk '{i=1;while(i<=NF){print $i;i++}}' file
1
2
3
4
5
6
7
8
9

3)for语句C语言风格

[root@jz ~]# awk '{for(i=1;i<=NF;i++)print $i}' file
1
2
3
4
5
6
7
8
9

倒叙打印文本(都换行了,这并不是我们想要的结果。需要改进一下)

[root@jz ~]# awk '{for(i=NF;i>=1;i--)print $i}' file 
3
2
1
6
5
4
9
8
7

想要的结果

[root@jz ~]# awk '{for(i=NF;i>=1;i--)printf $i" ";print ""}' file 
3 2 1 
6 5 4 
9 8 7 

排除第一行

[root@jz ~]# awk '{for(i=2;i<=NF;i++){printf $i" "};print ""}' file 
2 3 
5 6 
8 9 

排除第二行

[root@jz ~]# awk '{for(i=1;i<=NF-1;i++){printf $i" "};print ""}' file 
1 2 
4 5 
7 8 

ip加单引号(\047是ASCII码,可以通过showkey -a命令查看,ctrl +d退出)
[root@jz ~]# echo '119.20.249.151 119.20.249.152 119.20.249.153'|awk '{for(i=1;i<=NF;i++)printf "\047"$i"\047"}'
'119.20.249.151''119.20.249.152''119.20.249.153'

4)for语句遍历数组
[root@jz ~]# seq -f "str%.g" 5|awk '{a[NR]=$0}END{for(v in a)print v,a[v]}'
4 str4
5 str5
1 str1
2 str2
3 str3

5)break和continue语句
break跳过所有循环,continue跳过当前循环
[root@jz ~]# awk 'BEGIN{for(i=1;i<=5;i++){if(i==3){break};print i}}'
1
2
[root@jz ~]# 
[root@jz ~]# awk 'BEGIN{for(i=1;i<=5;i++){if(i==3){continue};print i}}'
1
2
4
5

6)删除数组和元素
[root@jz ~]# seq -f "str%.g" 5|awk '{a[NR]=$0}END{delete a;for(v in a)print v,a[v]}'
[root@jz ~]# 
[root@jz ~]# seq -f "str%.g" 5|awk '{a[NR]=$0}END{delete a[3];for(v in a)print v,a[v]}'
4 str4
5 str5
1 str1
2 str2

7)exit语句
exit退出程序,与shell的exit一样。[ expr ]是0-255之间的数字
[root@jz ~]# seq 5|awk '{if($0~/3/)exit (123)}'
[root@jz ~]# echo $?
123

作者: 技术张儿 本文发布于2018-9-20 12:55:31
免责声明:本文仅代表作者个人观点。