awk -v是否接受命令替换?

时间:2013-12-21 22:22:42

标签: bash awk command-substitution

我可以使用bash命令替换技术在一个内核中创建一个awk变量吗?这是我正在尝试的,但有些事情是不对的。

awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if ( AVG >= 1 ) print "there is a load"  }'

也许是因为命令替换使用了Awk(虽然我对此表示怀疑)?也许这也是“Inception-ish”? GNU Awk 3.1.7

4 个答案:

答案 0 :(得分:3)

为什么要在这里使用变量?只要AWK读取stdin,除非您明确指出相反的情况,否则这应该是一种更好的方式:

$ uptime | awk '$(NF-2) >= 1 { print "there is a load" }'
there is a load

答案 1 :(得分:1)

你的命令没有错。你的命令正在等待输入,这是它没有被执行的唯一原因!

例如:

$ awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if ( AVG >= 0 ) print "there is a load"  }'
abc                 ## I typed.
there is a load     ## Output.

按照专家的建议,将BEGIN包含在您的命令中!

$ awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if ( AVG >= 0 ) print "there is a load"  }'
there is a load

答案 2 :(得分:0)

由于上一个awk命令没有输入文件,因此只能对该脚本使用BEGIN子句。所以你可以尝试以下方法:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if ( AVG >= 1 ) print "there is a load"  }'

答案 3 :(得分:0)

此:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if ( AVG >= 1 ) print "there is a load"  }'

需要一个BEGIN,正如其他人所说:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if ( AVG >= 1 ) print "there is a load"  }'

但是,你也不需要两次调用awk,因为它可以写成:

awk -v uptime=$(uptime) 'BEGIN{ n=split(uptime,u); AVG=u[n-2]; if ( AVG >= 1 ) print "there is a load"  }'

或者更有可能是你想要的:

uptime | awk '{ AVG=$(NF-2); if ( AVG >= 1 ) print "there is a load"  }'

可以简化为:

uptime | awk '$(NF-2) >= 1 { print "there is a load"  }'