使用 awk 命令开始和结束

Joh*_*ino 16 awk

根据 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不是多余的。如果您不指定BEGINprint则将对每一行输入执行。

引用手册

一个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