(16)awk流程控制之break、continue、next、nextfile、exit语句

break和continue

break可退出for、while、do...while、switch语句。

continue可让for、while、do...while进入下一轮循环。

[root@docker-01 ~]# awk '
> BEGIN{
>   for(i=0;i<10;i++){
>     if(i==5){
>       break
>     }
>     print(i)
>   }
> 
>   # continue
>   for(i=0;i<10;i++){
>     if(i==5)continue
>     print(i)
>   }
> }'
0
1
2
3
4
0
1
2
3
4
6
7
8
9

next和nextfile

next会在当前语句处立即停止后续操作,并读取下一行,进入循环顶部。

例如,输出除第3行外的所有行。

[root@docker-01 ~]# awk 'NR==3{next}{print}' a.txt
ID  name    gender  age  email          phone
1   Bob     male    28   abc@qq.com     18023394012
3   Tony    male    21   aaa@163.com    17048792503
4   Kevin   male    21   bbb@189.com    17023929033
5   Alex    male    18                  18185904230
6   Andy    female  22   ddd@139.com    18923902352
7   Jerry   female  25   exdsa@189.com  18785234906
8   Peter   male    20   bax@qq.com     17729348758
9   Steven  female  23   bc@sohu.com    15947893212
10  Bruce   female  27   bcbd@139.com   13942943905
[root@docker-01 ~]# awk 'NR==3{getline}{print}' a.txt
ID  name    gender  age  email          phone
1   Bob     male    28   abc@qq.com     18023394012
3   Tony    male    21   aaa@163.com    17048792503
4   Kevin   male    21   bbb@189.com    17023929033
5   Alex    male    18                  18185904230
6   Andy    female  22   ddd@139.com    18923902352
7   Jerry   female  25   exdsa@189.com  18785234906
8   Peter   male    20   bax@qq.com     17729348758
9   Steven  female  23   bc@sohu.com    15947893212
10  Bruce   female  27   bcbd@139.com   13942943905

nextfile会在当前语句处立即停止后续操作,并直接读取下一个文件,并进入循环顶部。

例如,每个文件只输出前2行:

[root@docker-01 ~]# awk 'FNR==3{nextfile}{print}' a.txt a.txt
ID  name    gender  age  email          phone
1   Bob     male    28   abc@qq.com     18023394012
ID  name    gender  age  email          phone
1   Bob     male    28   abc@qq.com     18023394012

exit

exit [exit_code]

直接退出awk程序。

注意,END语句块也是exit操作的一部分,所以在BEGIN或main段中执行exit操作,也会执行END语句块。

如果exit在END语句块中执行,则立即退出。

所以,如果真的想直接退出整个awk,则可以先设置一个flag变量,然后在END语句块的开头检查这个变量再exit。

BEGIN{
    ...code...
    if(cond){
        flag=1
        exit
    }
}
{}
END{
    if(flag){
        exit
    }
    ...code...
}

awk '
    BEGIN{print "begin";flag=1;exit}
    {}
    END{if(flag){exit};print "end2"}
' 

exit可以指定退出状态码,如果触发了两次exit操作,即BEGIN或main中的exit触发了END中的exit,且END中的exit没有指定退出状态码时,则采取前一个退出状态码。

[root@docker-01 ~]# awk 'BEGIN{flag=1;exit 2}{}END{if(flag){exit 1}}' 
[root@docker-01 ~]# echo $?
1
[root@docker-01 ~]# awk 'BEGIN{flag=1;exit 2}{}END{if(flag){exit}}' 
[root@docker-01 ~]# echo $?
2

 

posted @ 2020-03-02 20:51  星火撩原  阅读(1227)  评论(0编辑  收藏  举报