出力を変数に保存して再利用する

出力を変数に保存して再利用する
page=`grep $x /var/www/vhosts/example.com/statistics/logs/access_log | awk '{print $7}'| sort |uniq -c |sort -nr`
times=`$page | wc -l`

grepの出力を変数にpage

しかし、grep出力を再利用して別のものを計算したいと思います。

以下のコードは次のようになります。

command not found

問題を解決し、出力を再利用する方法は?

答え1

page変数には任意のテキストを含めることができるので、を使用しないでくださいecho。を使用する必要があります。printf

times="$(printf %s\\n "$page" | wc -l)"

また、コマンド出力に末尾の改行文字が複数ある場合、grepとにかく期待した結果が得られません。コマンド置換は末尾の改行を削除します。echo私が使用したコマンドやprintf同様のコマンドは正確に追加されます一つgrep変数を設定するときに出力から削除される改行の数に関係なく、末尾の改行です。$page


もちろん、この場合でも変数の情報が出力される方法$timesなので、変数の先頭に余分な空白がたくさんあるはずです。wc -lしたがって、この答えはスクリプトのより広い問題を解決しません。より良いサービスを提供したいと思いますbashawk

変数をどのように扱うかによって、私が間違っている可能性がありますが、$times真剣に疑わしいです。おそらく必要なことができるでしょう(みんな必要なもの)をawk一文で表現します。

答え2

修正する:複数行の$ page値を修正して、@Wildcardに感謝します!

2号線に非常に近いです。 1行目が機能している限り、2行目では以下を試してください。

times="$(echo "$page" | wc -l)"

説明する

  • $(バックティック(ここで呼び出されている))を使用するのと同じコマンド置換ですが、コードで簡単に見つけることができるので、これは好みです。man bashbackquotes$( )
  • 単なる所有だけでは$page何も渡されません。wc -l
  • $page代わりに、Bashはユーザーがコマンドで作成したすべてを実行し、そのコマンドの出力をに渡すと思うので、含まれているwc -l場合はコマンドだと思います。これは、見たときに見られるようなエラーを引き起こす可能性があります。$page5 bla5 blacommand not found
  • したがって、値を渡すためにecho変数を使用できます。$page
  • ただし、$page複数行の値を含めると、デフォルト値が行を失い、echo $page空白になります。
  • $pageこれらの望ましくない結果を避けるために、値と新しい行を引用符で囲んで保存してください。echo "$page"

したがって、 を利用すればecho "$page"正確にwc -l$pageを受け取ることができるようになります。

関連情報