awk脚本仅执行BEGIN和END块 中间无模式匹配代码块不运行问题排查
问题原因
awk 的代码块执行逻辑遵循固定规则:
- BEGIN 块:读取任何输入之前执行,仅运行1次
- 无匹配规则的普通代码块:对每一行有效输入文本执行,有多少行输入就运行多少次
- END 块:所有输入处理完成后执行,仅运行1次
你执行命令awk -f joint.awk .时传入的参数是.即当前目录,awk 不会将目录识别为有效输入源,也无法读取到任何可处理的文本行,因此普通代码块没有触发条件,自然不会输出对应内容。
当你传入普通文本文件运行时,文件包含可读取的有效行,普通代码块可以逐行触发,所以执行符合预期。
解决方案
根据你的使用场景选择对应方案即可:
- 如果你只是需要当前脚本输出预期内容,人为提供至少一行输入触发普通块即可,执行命令改为:
echo | awk -f joint.awk
空行输入会触发一次普通块执行,即可得到你想要的输出。
- 如果你不需要依赖输入内容,就是要固定打印这段文本,直接把
print "Don't Panic"逻辑移到BEGIN块里即可,不需要放在普通块中。 - 如果你是要处理真实的文本文件,直接把命令里的
.替换为对应文本文件的路径即可。
内容的提问来源于stack exchange,提问作者Zach Folwick
相关产品推荐
相关产品推荐

