前のプログラムからの出力の行数を数える


32

特定のプログラムが生成する出力の行数をカウントしようとしています。問題は、プログラムの実行に時間がかかるため、ユーザーに出力を表示したいことです。最後のコマンドが出力した行数をカウントする方法はありますか?

できますprogram | wc -lが、ユーザーに出力が表示されません。私の知る限り、やらなければならないことですprogram; program | wc -lが、プログラムの実行には少なくとも1分かかります。したがって、行数を一番下に表示するためだけに複数回実行する必要はありません。

編集:

  • 出力を行ごとに表示し、最後にカウントを返す方法はありますか?

方法:プログラムに独自の出力を追跡させ、プログラムSTDOUT_WRITE_COUNTの最後に変数(例えば)からその値を読み取るか、ファイル/ APIにログを記録します。WDYT?
mecampbellsoup

回答:


43

通常のように、一方のコピーをSTDOUTにtee送信する出力ストリームを分割するために使用できますwc

program | tee >(wc -l)

これ>(cmd)は、bash構文を実行cmdし、>(cmd)ビットをそのプログラムのSTDINへのパス(名前付きパイプに接続)に置き換えることを意味します。


2
>(cmd)ksh構文もand によって認識されzsh、を持たないシステムでbashのみ名前付きパイプを使用しています/dev/fd/n
ステファンシャゼル

@StephaneChazelasはい、ほとんどのシェルでサポートされていますが、POSIXではサポートされていないため、どこにでも依存することはできません。
パトリック

はい、bashあなたの答えの文言が信じさせることができるので、私はプロセス置換が発明ではなかったことを指摘していました。
ステファンシャゼル

1
@TheLibbsterは、効率的な定義方法によって異なります。この方法では、as sedとas awkが1つの場合に、2つの追加プロセスが生成されます。しかし、teewcの両方の非常に(よりはるかに小さい小さいsedawk)。
パトリック

1
@TheLibbsterはい、たった今行ったいくつかの簡単なテストによると、実際にはメソッドsedawkメソッドの約2倍の速さです。(dd100 MBの/dev/urandomファイルを作成し、そのファイルを各メソッドで数回実行しました)
パトリック

10

1つのオプションはawkを使用することです。awkはカウントを実行し、stdoutに出力できます。

program | awk '{ print } END { print NR }'

awk、NRは現在の行番号です。perlでも同じことができます。

program | perl -pe 'END {print "$.\n"}'

またはsed

program | sed -n 'p;$='

出力を行ごとに表示し、最後にカウントを返す方法はありますか?
リブックス

6

stderrでstdoutのクローンを作成できます。

program | tee /dev/stderr | wc -l

そのようにして、programのstdoutはパイプさteeれてstderrに書き込まれ、コンソールに出力されます。teeまた、パイプされたデータをにパイプされたstdoutに書き込みますwc


3

私のお気に入りのオプション:

program | grep "" -c

1
OPは何か他のことを尋ねたかもしれませんが、行数のカウントを取得するためだけにここに来て、実際の出力を表示することを気にしませんでした。ありがとう!
ニキルVJ

0
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)

0

これは遅いかもしれません。しかし、変数でカウントされた数をキャッチする方法に関するあなたのフォローアップの質問に対処します。

これはあなたが欲しいものですYOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)

teeここで2つのストリームを生成することを利用して/dev/stderr、1つを画面に表示し、もう1つをwc -l行数を報告するに転送します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.