有两种方法可以通过命令行设置 awk 变量吗?

Pet*_*r.O 11 awk

我注意到一个 O'Reillyawk示例(1997),它通过在程序文本之后的命令行上设置它来分配一个 awk 变量。它确实有效,但我在man / info awk 中找不到这种语法。我刚刚错过了吗?它被贬低了吗……?我在手册中看到的唯一语法是-v选项。

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline
Run Code Online (Sandbox Code Playgroud)

输出: cat dog

Mat*_*Mat 12

它实际上在 POSIX 中awk(链接到 POSIX 2008,我相信以前的版本也有)。选项部分-v描述,另一种方式是在操作数部分。

-v在文件名的末尾传递赋值和传递赋值之间存在差异:

  • -v

应用程序应确保赋值参数与赋值操作数的形式相同。指定的变量赋值应在执行 awk 程序之前发生,包括与 BEGIN 模式(如果有)相关的操作。可以指定多次出现此选项。

  • 与文件名混合:

[...] 每个这样的变量赋值都应该在处理以下文件之前发生,如果有的话。因此,第一个文件参数之前的赋值应该在 BEGIN 动作(如果有的话)之后执行,而最后一个文件参数之后的赋值应该在 END 动作(如果有的话)之前执行。如果没有文件参数,则应在处理标准输入之前执行赋值。

例子:

$ cat input 
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four
Run Code Online (Sandbox Code Playgroud)