일부 진행 상황 출력을 편집하는 데 문제가 있습니다. 이 경우에는 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
이것은진주한 줄은 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"