パイプラインの行数を取得します。

パイプラインの行数を取得します。

次のbashスクリプトがあります。

some_process | sort -u | other_process >> some_file

データのストリーミング中にデータがソートされた後、other_processによって処理される前に行数を取得したいと思います。次のように試しました。

some_process | sort -u | tee >(wc -l > $some_var_i_can_print_later) | other_process >> some_file

これは私にとってはうまくいきません。パイプからデータを転送しながら変数にカウントを保存する方法はありますか?

また、クリーニングについて心配する必要があるtmpfilesの使用を避けたいと思います。

ベストアンサー1

ファイル記述子を使用すると、さらに一歩進むことができます。

VAR=$(
  exec 3>&1
  some_process | sort -u | tee >(wc -l >&3) | other_process >> some_file
)

または:

VAR=$({
  some_process | sort -u | tee >(wc -l >&3) | other_process >> some_file
} 3>&1)

other_processsの出力はに追加されますが、some_fileswc -lはfdにリダイレクトされ、3VARに割り当てられる元のstdoutを指します。

おすすめ記事