我注意到一个 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)