awk代码需按CTRL+D才结束?BEGIN块与普通动作块差异解析
为什么awk中把print动作放在BEGIN块外需要手动结束才输出?
这个问题本质是没搞懂awk的核心执行流程,我给你拆解明白:
首先,awk的运行逻辑是固定的三步:
- 先执行BEGIN块里的代码——这部分是在处理任何输入之前就运行的,只执行一次。
- 然后进入主循环:逐行读取输入(文件或标准输入),每读一行就执行你写的非BEGIN/END的动作块(就是你代码里单独的
{print 18.23})。 - 所有输入处理完后,执行END块(如果有的话),然后程序退出。
现在看你的第一段代码:
awk 'BEGIN {OFMT="%.0f"} {print 18.23}'
- BEGIN块先执行,设置了输出格式为整数。
- 接下来awk开始等待输入——因为你没指定输入文件,它默认从键盘(标准输入)读取内容。
- 你第一次按回车,其实是输入了一行空内容,这时候awk触发主循环,对这行空内容执行
{print 18.23},所以输出了18。但awk还在等着下一行输入,直到你按Ctrl+D发送EOF(结束符),它才会结束主循环退出程序。
而修改后的代码:
awk 'BEGIN {OFMT="%.0f";print 18.23}'
- 把
print放到了BEGIN块里,这部分代码在处理输入之前就执行完了,执行完BEGIN块后,awk发现没有需要处理的主循环逻辑(没有非BEGIN/END的动作块),直接就退出程序了,自然不需要你手动按Ctrl+D,输出也会立刻显示。
简单总结:单独的动作块是给每一行输入准备的,awk会一直等输入直到你告诉它没有更多内容;而BEGIN块是启动时一次性执行的,执行完就没后续等待了。
内容的提问来源于stack exchange,提问作者tonyibm
相关产品推荐
相关产品推荐

