進行状況バーを含む出力をリアルタイムでgrepする方法は?

進行状況バーを含む出力をリアルタイムでgrepする方法は?

openocd私はゴミをたくさん印刷するツール()を使用していますが、デフォルトの進行状況バーはゆっくりと簡単な点を印刷してから、いくつかのゴミを印刷します。

grep進行状況バーがある行だけがリアルタイムで表示されるように(つまり、各出力ポイントが端末openocdにすぐに印刷されるように)、この出力をフィルタリングしたいと思います。

openocd <args> |& grep '^\.'

問題はgrep(せいぜい)ラインバッファリングなので、完了するまで進行状況バーが表示されないことです。

この問題をどのように解決するのですか?grepそれともこれを達成するための標準的な選択肢はありますか?openocd私はより一般的な解決策を好みますが、設定を介して方法がある場合は便利です。

ベストアンサー1

これはハッキーで珍しい答えです。実際、これはあまりきれいではない方法で実装されている可能性が高いです。


grepこれは改行文字が表示されたときにのみ出力を印刷するように見えます。更新時に進行状況バーに改行文字が表示されない可能性があるため、問題が発生します。

straceコマンドが呼び出すシステムコールを表示するためのツールです。これには、メモリ/ストレージへの読み書き、ファイルディスクリプタの開閉などの操作が含まれます。


パイプが渡されると、straceプロセスがアクセスする内容が表示され、テキストが提供されていることがわかります。パイプされたコマンドの出力は定期的に送信され、その出力をスニッフィングして表示できます。テスト中ですが、同様の状況が発生しているようです。進捗状況を示すために使用しました。stoutgrepstracegrepstracersync --progressgrep##%rsync

rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%"

このコマンドを実行するとstrace出力が良くないことがわかりますが、このコマンドを使用すると、一般的に表示されないstrace一部のsをキャプチャして、sを0%、21%、45%、68%と表示します。read91%と100%は毎秒更新されるようです(おそらく進行状況が更新される頻度によって異なります)。rsyncgrepwritereadrsync

したがって、同じ出力を再度呼び出すと、あまり良い出力が得られませんgrepstracegrep

rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%" 2>&1 > /dev/null | grep -o "[0-9]*%"

最初の出力が報告されないように.redirectsとして印刷する2>&1ため、これは重要です。最終結果は次のとおりです。stracestderr> /dev/nullstdout/dev/nullgrep

0%
21%
45%
68%
91%
100%

交換する必要がありますgrepが効果があるようです。きれいではありませんが、動作してバイパスすることができます。このようなものが便利なgrepようです(すでに使用されていることを知っています)。grep -ftail -fgrep -f

1つ目は、主にgrep実行されるテキストをフィルタリングすることですstracereadなぜなら、一致する行だけが呼び出しにリストされているからですstrace。ただし、テキストを表示できるreadように移動するには何かが必要です。strace

おすすめ記事