根据 awk 手册,BEGIN 和 END 不用于匹配输入,而是用于向 awk 脚本提供启动和清理信息。这是给出的示例:
ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf
Run Code Online (Sandbox Code Playgroud)
首先,这会打印一个要输出的字符串。然后它检查输入的模式匹配,其中输入以 a 或 x 开头,后跟任何字符一次或多次,然后是 .conf。对于任何匹配项,将打印第 9 列。
我们被迫在这里使用begin这一事实,是否意味着awk最多只能使用一个包含BEGIN或END的打印函数?如果不是,那为什么我们不能在没有关键字BEGIN的情况下使用开头的print函数呢?似乎 BEGIN 是多余的。
dev*_*ull 15
这BEGIN不是多余的。如果您不指定BEGIN,print则将对每一行输入执行。
引用手册:
一个
BEGIN规则仅一次执行时,读取第一个输入记录之前。同样,END在读取所有输入后,规则仅执行一次。
$ seq 5 | awk 'BEGIN{print "Hello"}/4/{print}' # Hello printed once
Hello
4
$ seq 5 | awk '{print "Hello"}/4/{print}' # Hello printed for each line of input
Hello
Hello
Hello
Hello
4
Hello
$
Run Code Online (Sandbox Code Playgroud)
mkc*_*mkc 11
awk处理除和块之外的正文中给出的表达式的每一行输入。在和块的情况下,将只处理语句一次,分别在输入处理开始之前和输入处理完成之后。没有这个块,你不仅不能打印标题等一次性信息,还不能有效地初始化正文所需的一些变量。另外,仅供参考,一个程序可以有多个和块。BEGINENDBEGINENDawkBEGINawkBEGINEND