コマンドによって出力された行数をリアルタイムで表示するにはどうすればよいですか?

コマンドによって出力された行数をリアルタイムで表示するにはどうすればよいですか?

私はsvn exportアプリケーションのパッケージ スクリプトの一部として使用していますが、他の多くのコマンドと同様に、このコマンドには進行状況バーがないようです。

現時点では2つの選択肢があります。

  • オプションなしで使用し、数千行が出力されるのを確認します
  • を使用する--quietと、完了するまで何も表示されません。

少なくともコマンドによって出力された行数をリアルタイムで表示する方法はありますか? たとえば、次のようになります。

Exporting SVN directory ... 1234 files

この数字を見てください1234 リアルタイムで増加? 出力をこれを実行するコマンドにパイプすることは考えられますが、どのコマンドでしょうか?

答え1

yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

または、シェル スクリプトに括弧で囲まれたセクションを配置します。これは、bash や ksh93、zsh のように、シェルが実際に前置インクリメント演算子をサポートしている場合にのみ機能することに注意してください。それ以外の場合は、インクリメントして$Iから印刷する必要があります ( のようにI=$((I+1));printf...)。また、printfがシェルに組み込まれていない場合 (現在の bash には組み込まれています)、代わりにecho -neまたは を使用してprint -nパフォーマンスを向上させることができます。改行を抑制し、 \r をエスケープ文字として解釈するだけです。

答え2

これは大まかなアイデアですが、pvコマンドを使用して、通過する行の数をカウントし、それを画面に表示することができます。 多数のスイッチの中には、通過する各行をカウントするスイッチpvがあります。-l

ここでは、while ループを使用して、SVN 出力からいくつかのファイルをシミュレートしています。

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

出力行は次のように上書きされ続けます。

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

答え3

コマンドをジョブとしてバックグラウンドで実行し、その stdout (およびオプションで stderr) をログファイルにリダイレクトできます。command > logfile &ここで、&はジョブを指定します (stderr も の場合は、&>の代わりにと指定します>)。

次に、wordcount ユーティリティを使用して、ログファイル内の行数をカウントできますwc -l

動的に変化する 1 行で状態の変化を表示するには、 のようなものを使用できますが、前の行の内容を消去するためにwhile true; do echo -en '\r'; wc -l logfile; sleep 1; donebash に強制的に復帰を描画させることはできません。\r

この質問を見てください。ほぼ重複しています:https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash

関連情報