在 shell 脚本中使用 awk -v 变量

在 shell 脚本中使用 awk -v 变量

我正在修改/重写我公司前员工编写的一些脚本,在其中一个 shell 脚本中我发现了以下行。

b=`benchmark=30;grep "Waiting for timer" wk.txt | awk -vbenchmark=$benchmark '$6 > benchmark' | wc -l`

但遗憾的是,我无法弄清楚上面那行代码想要做什么。我对这里“基准”变量的使用感到困惑。我创建了一个具有以下值的虚拟“wk.txt”文件,当回显时,变量 $b 的值为 1(这只是 grep+awk 命令输出的行数。

[sreeraj@server ~]$ cat wk.txt
24  here  above the Waiting for timer 37 make sure

有人可以解释一下脚本作者试图用 $benchmark 做什么吗?

awk手册页显示了以下内容-v,但我不明白它的作用。

-v var=val
--assign var=val
          Assign the value val to the variable var, before execution of the program begins.   Such  variable  values  are
          available to the BEGIN block of an AWK program.

答案1

如果你这样做:

awk -v benchmark=30 '...'

这等同于:

awk 'BEGIN{ benchmark = 30 } ... '

这用于设置该变量的初始值。

虽然我不明白作者为什么这样做:

benchmark=30; ... | awk -v benchmark=$benchmark ..

他们不妨这样做:

... | awk -v benchmark=30 ..

答案2

造成混乱的原因可能是原作者在 shell 中使用了相同的变量名:

benchmark=30;gr...

正如他/她在里面所做的那样awk

awk -vbenchmark=$benchmark

哪个可以不可以将 shell 变量的值benchmark赋给awk变量benchmark

一旦awk获得此值(30在本例中),awk请检查输入文件的第 6 列wk.txt是否大于此值:

$6 > benchmark

因此,使用您的示例进行的测试是字符串比较:

for > 30

虽然合法,但实际上没有多大意义。示例输入文件是真实示例还是只是随机测试?

其计算结果为 true,因此awk打印整行并wc -l计算行数。由于输入文件中只有一行,因此第 6 列大于 30 的行数为1

该值被赋给 shell 变量b

相关内容