進行中の rsync コマンドからのログ ファイルがあります。この進行状況を実行すると、同じ行の表示情報が更新されます。このコマンドからの出力をキャプチャするとcat
、端末で正常に表示されるファイルが得られます (すべてのバックスペースと再編集が再生されます) がgrep
、ファイルで使用して処理できるようにしたいので、すべてのバックスペースが表示されますコマンドを編集します。ファイルを処理して進行状況の更新をすべて削除し、最終的な編集を含むファイルを取得するにはどうすればよいですか?
2 に答える
プログレス ラインが以前のものを上書きすることなく、キャプチャしたファイルがどのように見えるかを確認したい場合:
sed 's/\r/\n/g' capture-file
次のような結果が得られる可能性があります。
created directory /some/dest/dir
filename
32768 0% 0.00kB/s 0:00:00
6717440 21% 6.38MB/s 0:00:03
13139968 41% 6.25MB/s 0:00:02
19791872 62% 6.28MB/s 0:00:01
26214400 82% 6.24MB/s 0:00:00
31784420 100% 6.25MB/s 0:00:04 (xfer#1, to-check=0/1)
sent 31788388 bytes received 31 bytes 3346149.37 bytes/sec
total size is 31784420 speedup is 1.00
進行状況メッセージの最後のステップだけを表示し、前のステップを削除したい場合:
sed 's/.*\r/\n/g' capture-file
これは次のようになります。
created directory /some/dest/dir
filename
31784420 100% 6.25MB/s 0:00:04 (xfer#1, to-check=0/1)
sent 31788388 bytes received 31 bytes 3346149.37 bytes/sec
total size is 31784420 speedup is 1.00
ログ情報をファイルに取り込むオプションを指定しrsync
て実行できます。--log-file=name
「名前」は好きな名前に置き換えてください。オプションを使用してログに記録される情報を制御できlog-file-format
ます (詳細については、ログ形式のセクションman rsyncd.conf
を参照してください)。
私のシステムでは、デフォルトのrsync
ログ ファイルは次のようになります。
2009/11/01 17:19:20 [23802] building file list
2009/11/01 17:19:20 [23802] created directory /some/dest/dir
2009/11/01 17:19:25 [23802] <f+++++++++ filename
2009/11/01 17:19:25 [23802] sent 31788388 bytes received 31 bytes 3346149.37 bytes/sec
2009/11/01 17:19:25 [23802] total size is 31784420 speedup is 1.00
まず、さまざまな理由から進行状況インジケーターを維持することが重要であると推測しています。最も簡単な解決策は、それらをオフにすることです。第二に、画面に表示されるものとは別のファイルに進行状況インジケーター以外のすべてをログに書き出すように rsync に指示する方法はないと仮定しています。最後に、後で他のツールを使用して処理するログ ファイルに、進行状況インジケーターのようなものはまったく必要ないと仮定しています。
これらの 2 つの前提があれば、基本的に各行で \b または \r 文字を探し、それらの文字を含むすべての行を破棄することで、進行状況インジケーターを取り除くことができます。これは、次のような grep コマンド ラインと同じくらい簡単です。
grep -ve "$(echo -ne '[\b\r]')" logfile
"$(...)"
これは、スタイル引数置換をサポートするシェルと、引数をサポートする echo コマンドがあることを前提としてい-e
ます。