`wc -l`代替は、行が受信されたときの数を示します。

`wc -l`代替は、行が受信されたときの数を示します。

wc -l入力がパイプに接続されたときのコマンド出力の行数を計算するためにこれを使用しています。

commad | wc -l

これはうまく機能しますが、command計算が大幅に進行すると速度が遅くなる可能性があります。 「今までパイプされた」行数を表示する別の方法はありますか?

このようなものは、項目別の計算を行うときに特に便利です。

cat something | xargs -L1 heavy-per-line-computation | wc -l

これを手動で実行する1つの方法は、出力をファイル()にパイプしてcommand > file定期的にcat file | wc -l処理することです。しかし、私が望むのはコマンドです(I / Oの無駄を避けるためにファイルにリダイレクトしません)。

ベストアンサー1

awk '{print NR}'

このコマンドは、見つかった行ごとに新しい番号を印刷します。最後の行が完成すると、最後の数字は話した内容と一致しますwc -l。最後の行なら不完全その後(私のKubuntu GNUでは)awk計算することができますが(改行文字を計算するため)違いがあるかもしれません。awkwc -l

別の違いは、入力が完全に空の場合はwc -lprint0であり、私たちはawk何も印刷しないことです。印刷するには、0次のバリアントを使用します。

awk '{print NR} END {if (NR==0) print NR}'

あるいは、各新しい番号がコンソールの同じ行にある古い番号を上書きするようにすることもできます。それからこれ:

awk '{printf "\r%s",NR} END {print "\r"NR}'

例:yes | head -n 76543 | awk '{printf "\r%s",NR} END {print "\r"NR}'

コマンドは入力を消費します(teeおそらく便利です)。監視の目的で、次のことに興味があるかもしれません。

awk '{print NR OFS $0}'

ここで(デフォルトは空白)は(サポートされている場合)OFSほぼ同じです。cat -ncat-n


pv -l行数を計算し、パイプライン内で使用できます。例:

for i in 1 2 3 4 5; do date; sleep 1; done | pv -l | wc -l

pv -lbかなり小さい出力を考えてください。

おすすめ記事