我注意到一个 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
都支持它。