2017-03-01 249 views
-1

我試着將一個Awk命令的輸出分配給一個變量,但我收到一個錯誤。我想分配並在變量中回顯結果。如何將Awk命令的輸出分配給shell變量?

count = `awk '$0 ~ /Reason code "68"/' ladb.log | wc -l` 

我反引號的發言,並收到以下

/lsf9/db/dict/=: Unable to open dictionary: No such file or directory 
DataArea =    does not exist 
+2

你的腳本在'='周圍是否有空格? – kdhp

+1

如果你的腳本在'='的周圍有空格,那麼你需要使用'='作爲第一個參數和'awk ... | wc -l'作爲另一個參數。而且,無論出於什麼原因,'count'命令都不會將'='作爲字典的名稱,所以它會抱怨。 Shell腳本對空間非常敏感,並且在賦值操作符中不允許使用空格(或者,更準確地說,如果在您認爲是賦值運算符的位置放置空格,您的意圖將被完全誤解。 –

+1

可能重複[如何設置變量輸出從命令在Bash?](http://stackoverflow.com/questions/4651437/how-to-set-a-variable-to-the-output-from bash) –

回答

0

你的主要問題是你的空間使用此錯誤。您不能在shell腳本中進行間隔分配。

反引號可能會損害你的代碼,但我沒有在很長一段時間使用IBM AIX,所以它可能是你的Posix外殼必需(儘管this guide和其$(…) vs `…`覆蓋範圍可能不建議在這裏的一個問題)。你可以嘗試的一件事是用ksh或bash運行代碼。

以下代碼假定符合標準的Posix shell。如果它們不起作用,請嘗試用"`…`"表示法替換"$(…)"表示法。有了這些,因爲它只是一個被返回的數字,所以在技術上不需要使用周圍的雙引號,但這是一種很好的做法。

count="$(awk '$0 ~ /Reason code "68"/' ladb.log | wc -l)" 

以上應該工作,但它可以更乾淨的

count="$(awk '/Reason code "68"/ {L++} END { print L }' ladb.log)" 

正如評論的問題指出,grep -c可能比awk的快寫,但如果你知道的位置那個文本,awk可以更快一些。比方說,它開始直線:

count="$(awk '$1$2$3 == "Reasoncode\"68\"" {L++} END { print L }' ladb.log)" 

是的,Posix的外殼能夠理解一個"$(…)"內雙引號是不相關的外雙引號,awk會串需要內所以只有內部雙引號被逃脫。

相關問題