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