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
したがって、この答えはスクリプトのより広い問題を解決しません。より良いサービスを提供したいと思いますbash
。awk
変数をどのように扱うかによって、私が間違っている可能性がありますが、$times
真剣に疑わしいです。おそらく必要なことができるでしょう(みんな必要なもの)をawk
一文で表現します。
答え2
修正する:複数行の$ page値を修正して、@Wildcardに感謝します!
2号線に非常に近いです。 1行目が機能している限り、2行目では以下を試してください。
times="$(echo "$page" | wc -l)"
説明する
$(
バックティック(ここで呼び出されている))
を使用するのと同じコマンド置換ですが、コードで簡単に見つけることができるので、これは好みです。man bash
backquotes
$(
)
- 単なる所有だけでは
$page
何も渡されません。wc -l
$page
代わりに、Bashはユーザーがコマンドで作成したすべてを実行し、そのコマンドの出力をに渡すと思うので、含まれているwc -l
場合はコマンドだと思います。これは、見たときに見られるようなエラーを引き起こす可能性があります。$page
5 bla
5 bla
command not found
- したがって、値を渡すために
echo
変数を使用できます。$page
- ただし、
$page
複数行の値を含めると、デフォルト値が行を失い、echo $page
空白になります。 $page
これらの望ましくない結果を避けるために、値と新しい行を引用符で囲んで保存してください。echo "$page"
したがって、 を利用すればecho "$page"
正確にwc -l
値$page
を受け取ることができるようになります。