我正在修改/重写我公司前员工编写的一些脚本,在其中一个 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
。