2013-12-21 93 views
1

我可以使用bash命令替換技術在一個班輪中創建一個awk變量嗎?這是我正在嘗試的,但有些不對。awk -v是否接受命令替換?

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

也許是因爲命令替換使用了Awk(雖然我懷疑它)?也許這也是「先發制人」? GNU Awk 3.1.7

回答

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. 

只需在您的命令首先專家們的建議!

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

由於上一個awk命令沒有輸入文件,因此只能對該腳本使用BEGIN子句。因此,您可以嘗試以下操作:

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

爲什麼在這裏使用變量?至於AWK讀取stdin除非你明確指定相反,這應該是一個可取的方法:

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

你能解決您的錯字錯誤? (NF-2)缺少$ -sign。應該是$(NF-2)。 – alvits

+0

@ user3088572,謝謝。固定。抱歉。 –

+0

+1歡迎您。現在我可以投票了。 – alvits

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" }'