編集の進行などの出力をストリーミングする方法は?

編集の進行などの出力をストリーミングする方法は?

いくつかの進行状況の出力を編集する際に問題があります。これはPostgresですが、pg_basebackupカールやwgetなどの他の進行出力と似ています。例として:

generate_output() {
    for f in {1..500}; do 
        sleep 0.01
        echo -ne "Downloading... $f/500 foo   \\r"
    done
    echo -e "\nSome final line 1\nSome final line 2"
}

どちらがそのような出力を持っていますか?

Downloading... 1/500 foo
(...same line...)
Downloading... 500/500 foo
Some final line 1
Some final line 2

進行状況と同様の特性を維持しながら、この出力から「foo」をどのように削除できますか?(バッファリングされて役に立たない代わりに)

私は両方とも試しましたが、awkどちらもラインバッファリングに大きく依存しているようで、完全に終了するまでsed出力に改行はありません。Downloading...

CR私が得た最も近いのは、最初に交換しLFてから再び交換するハッキングでした。ただし、これにより実際の改行文字が混乱します(例:「Some Final line 1」)。

generate_output | stdbuf -i0 -o0 tr $'\r' $'\n' | sed -u -e 's/ foo//' | stdbuf -i0 -o0 tr $'\n' $'\r'

これを設定awkまたは処理する方法はありますか?sedそれとも仕事に良いツールがありますか?

メモ:

  • 上記の出力は一般的な目的で削除されました。実際の出力はです42318/42318 kB (100%), 1/1 tablespace。カンマを含むすべての内容を切り取りたいです。
  • awk -Wインタラクティブオプションのいくつかの提案を見ましたが、そのオプションは利用できません。

答え1

これは真珠1行はgenerate_outputを次にパイプします。

perl -e '$/ = "\r"; $| = 1; while(<STDIN>){s/ foo//;print;}'

$/入力行区切り文字を設定し、$|出力をバッファリングしないようにします。

答え2

これは強く打つパイプラインをgenerate_output次に接続するソリューション:

#!/bin/bash
while read -d $'\r' line
do      echo -ne "${line% foo}\r"
done
echo "$line"

関連情報