2017-03-01 11 views
-1

Awkコマンドの出力を変数に代入しようとしましたが、エラーが発生しました。変数に代入して結果をエコーし​​たいと思います。Awkコマンドの出力をシェル変数に割り当てる方法は?

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

スクリプトに '='のところにスペースがある場合は、最初の引数として '='を指定して 'count'コマンドを実行し、' awk ... |他の引数として「wc -l」を指定します。そして、何らかの理由で、 'count'コマンドは辞書の名前として' = 'を好きではないので、それは文句を言う。シェルスクリプティングは非常にスペースに敏感で、代入演算子の代入のスペースは許されません(より正確には、代入演算子と思われる部分にスペースを入れると完全に誤解されます)。 –

+1

[Bashのコマンドの出力に変数を設定する方法は?](http://stackoverflow.com/questions/4651437/how-to-set-a-variable-to-the-output-from) -a-command-in-bash) –

答えて

0

の下に、このエラーを受け取りました。シェルスクリプトでは、スペースが割り当てられていないことがあります。 this guide$(…) vs `…`のその適用範囲は、おそらくここでの問題を示唆していないのに(

バッククォートは、あなたのコードに有害かもしれないが、私は非常に長い時間でIBM AIXを使用していないので、それはあなたのPOSIXシェルに不可欠であり)。あなたが試すことができることの1つは、kshまたはbashでコードを実行することです。

次のコードは、標準準拠のPosixシェルを前提としています。動作しない場合は"$(…)"の表記を"`…`"の表記に置き換えてください。これらは、返される数値なので、技術的には二重引用符を使用する必要はありませんが、それは良い方法です。

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はさらに速くなります。はい、posixシェルが"$(…)"の内側に二重引用符を理解することのできる

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

そのawkの文字列の必要性内の外側の二重引用符、これだけ内側の二重引用符に関連していない:それは、行を開始しましょうエスケープする。

関連する問題