편집 진행과 같은 출력을 스트리밍하는 방법은 무엇입니까?

편집 진행과 같은 출력을 스트리밍하는 방법은 무엇입니까?

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

관련 정보