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

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

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

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

输出:cat dog

答案1

它实际上是在 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

答案2

这是在外部设置变量的旧风格awk。它是不明确的(如果你有一个名为 的文件名怎么办foo=cat),所以后来的版本添加了一个-v选项。它可能应该适用于向后兼容,但你不能保证。正如我所说,该-v选项较新,因此并非所有版本awk都支持它。

相关内容