いくつかの進行状況の出力を編集する際に問題があります。これは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"