特定のプログラムが生成する出力行数をカウントしようとしています。問題はプログラムです。実行に時間がかかり、出力をユーザーに表示したい。最後のコマンドが出力した行数をカウントする方法はありますか?
program | wc -lを実行できましたが、出力がユーザーに表示されませんでした。私の知る限り、program; program | wc -lを実行する必要がありますが、プログラムの実行には少なくとも1分かかるため、2回以上実行する必要はありません。下部に行数を表示します。
編集:
- 出力が発生したときに(1行ずつ)表示し、最後にカウントを返す方法はありますか?
コメント
回答
teeを使用して、出力ストリームを分割し、1つのコピーをwcに送信してもう1つは通常のようにSTDOUTにコピーします。
program | tee >(wc -l)
>(cmd)はbash構文で、ruを意味します。 n cmdそして、>(cmd)ビットをそのプログラムのSTDIN(に接続された名前付きパイプ)へのパスに置き換えます。
コメント
-
>(cmd)はksh構文でありおよび
bashであり、' tには/dev/fd/nがあります。 - @StephaneChazelasはい、ほとんどのシェルでサポートされていますが、'にはありません。 POSIXなので、'どこにでもあるとは限りません。
- はい、プロセス置換は答えの文言としての発明は、信じさせることができます。
- @TheLibbster効率的な定義方法によって異なります。この方法では、2つの追加プロセスを生成する必要がありますが、
sedとawkは1つだけです。ただし、teeとwcはどちらも非常に小さい(sedと
)。
sedメソッドとawkメソッドの両方として。 (dd 100mbの/dev/urandomをファイルに追加し、そのファイルを各メソッドで数回実行しました)
STDOUT_WRITE_COUNT)、またはプログラムの最後にファイル/ APIに記録します。WDYT?