コマンド出力行数をリアルタイムで表示する方法は?

コマンド出力行数をリアルタイムで表示する方法は?

私は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通過する各ラインの数を数えるスイッチがある。

はい

ここでは、SVN出力の一部のファイルをシミュレートするためにwhileループを使用しています。

$ 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

動的に変更された行でステータスの変更を表示するには、次のようなものを使用できますが、bashが前の行の内容を殺すキャリッジリターンを描画するようにwhile true; do echo -en '\r'; wc -l logfile; sleep 1; done強制することはできません。\r

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

関連情報