1 第7.8节:awk语言 next 语句

next 语句会迫使 awk 立即停止处理当前记录,转而处理下一条记录。这意味着,当前记录不会再执行后续规则,当前规则中 next 之后的操作也不会执行。

将其与 getline 函数的效果对比。getline 也会让 awk 立即读取下一条记录,但它不会改变控制流(即当前操作的剩余部分会用新输入记录继续执行 )。

从最高层面来看,awk 程序的执行过程是一个循环:读取一条输入记录,然后用每条规则的模式去匹配它。如果你把这个循环想象成一个 for 语句,其循环体包含这些规则,那么 next 语句就类似于 continue 语句。它会跳到这个隐式循环体的末尾,执行增量操作(即读取下一条记录 )。

例如,假设一个 awk 程序只处理有四个字段的记录,遇到无效输入时不能出错。为了不把程序其他部分搞复杂,可以在开头附近写一个“剔除”规则,如下:

NF != 4 {
    printf("%s:%d: skipped: NF != 4\n", FILENAME, FNR) > "/dev/stderr"
    next
}

由于 next 语句的存在,程序后续的规则不会处理这条无效记录。错误消息被重定向到标准错误输出流,这是错误消息应有的去向。

如果 next 语句导致输入读完(到达末尾 ),那么所有 END 规则中的代码会执行。

next 语句不允许在 BEGINFILEENDFILE 规则内使用。

根据 POSIX 标准,如果在 BEGINEND 规则内使用 next 语句,行为是未定义的。gawk 会将其视为语法错误。虽然 POSIX 标准不禁止在函数体内使用 next 语句,但大多数其他 awk 实现不允许这样做。和其他语句一样,函数体内的 next 语句会读取下一条记录,并从程序的第一条规则开始处理该记录。


作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐