特定のプログラムが生成する出力の行数を数えようとしています。問題は、プログラムの実行に時間がかかり、出力をユーザーに表示したいことです。 最後のコマンドが出力した行数をカウントする方法はありますか?
私はそれをできた program | wc -l
しかし、それはユーザーに出力を表示しません。だから私が知る限り、私はprogram; program | wc -l
-しかし、プログラムの実行には少なくとも1分かかるため、下部に行数を表示するためだけに複数回実行する必要はありません。
編集:
tee
を使用して、通常のように1つのコピーをwc
に送信し、もう1つのコピーをSTDOUTに送信する出力ストリームを分割できます。
_program | tee >(wc -l)
_
>(cmd)
はbash構文です。つまり、cmd
を実行し、>(cmd)
ビットをそのプログラムのSTDIN(に接続されている名前付きパイプ)へのパスに置き換えます。
1つのオプションは、カウントを実行してstdoutに出力できるawkを使用することです。
program | awk '{ print } END { print NR }'
awk
では、NRは現在の行番号です。 Perlでも同じことができます。
program | Perl -pe 'END {print "$.\n"}'
またはsed
:
program | sed -n 'p;$='
Stderrでstdoutを複製できます。
program | tee /dev/stderr | wc -l
こうすることで、program
のstdoutがtee
にパイプされてstderrに書き込まれ、コンソールに出力されます。 tee
は、それにパイプされたデータをそのwc
にパイプされたstdoutにも書き込みます。
私のお気に入りのオプション:
program | grep "" -c
tail -f /var/log/squid/access.log | ( c=0; pl() { echo $c; c=0; }; trap pl SIGHUP; while read a; do (( c=c+1 )); done ) & ( trap 'kill $! ; exit' SIGINT; trap '' SIGHUP; while true; do kill -HUP $! ; sleep 1; done)
これは遅いかもしれません。しかし、私は変数でカウントされた数をキャッチする方法に関するあなたのフォローアップ質問に対処します。
これがYOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
です。
ここでは、tee
を使用して2つのストリームを生成し、1つを/dev/stderr
は画面に表示され、もう1つはwc -l
、行数を報告します。