特定のプログラムによって生成された出力行数を計算しようとしています。問題は、プログラムの実行に時間がかかり、出力をユーザーに表示したいということです。最後のコマンドで出力された行数を計算する方法はありますか?
これは可能ですが、program | wc -l
ユーザーに出力は表示されません。私が知っている限り、これを行う必要がありますprogram; program | wc -l
が、プログラムを実行するのに少なくとも1分かかりますので、一番下に行数を表示するためにこれを何度も実行する必要はありません。
編集する:
- 出力を1行ずつ表示してから最後に数を返す方法はありますか?
答え1
tee
出力ストリームを通常のように分割して、1つのコピーをSTDOUTに送信し、wc
もう1つをSTDOUTに送信できます。
program | tee >(wc -l)
bash構文は>(cmd)
、実行してそのビットをプログラムの接続された名前付きパイプ(STDIN)パスに置き換えることを意味しますcmd
。>(cmd)
答え2
1つのオプションは、計算を実行して標準出力に印刷するawkを使用することです。
program | awk '{ print } END { print NR }'
ここで、awk
NRは現在の行番号です。 Perlを使用して同じことを実行できます。
program | perl -pe 'END {print "$.\n"}'
またはsed
:
program | sed -n 'p;$='
答え3
私が好きな選択:
program | grep "" -c
答え4
遅れるかもしれません。しかし、変数から数をキャプチャする方法に関する後続の質問を解決したいと思います。
これがあなたが望むものですYOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
。
私たちはそれを利用してtee
2つのストリームを作成し、1つは/dev/stderr
画面に表示され、もう1つは行wc -l
数を報告するように渡します。