Como faço para transmitir a saída semelhante a um progresso de edição?

1

Estou com problemas para editar alguma saída de progresso. Nesse caso, é o pg_basebackup do Postgres, mas é semelhante a outras saídas de progresso, como curl e wget. Tomemos por exemplo a saída disso:

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"
}

Que tem saída como esta

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

Como eu poderia remover o "foo" dessa saída, mantendo a natureza de progresso? (em vez de ser armazenado em buffer e, portanto, inútil)

Eu tentei tanto o awk quanto o sed , mas ambos parecem depender muito do buffer de linha, e não há nenhuma nova linha na saída Downloading... até que esteja completamente terminada.

O mais próximo que obtive é um hack que primeiro substitui CR por LF , depois o substitui novamente depois. Mas isso estraga as novas linhas reais (por exemplo, "Alguma linha final 1")

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

Existe uma maneira de configurar awk ou sed para lidar com isso? Ou uma ferramenta melhor para o trabalho?

Notas:

  • A saída acima foi sanitizada para generalidade. A saída real é 42318/42318 kB (100%), 1/1 tablespace e gostaria de cortar tudo, incluindo e depois da vírgula.
  • Eu vi algumas sugestões em torno da opção interativa awk -W, que não está disponível para mim.
por Mark Peters 06.10.2015 / 19:13

2 respostas

2

Aqui está um one-liner perl para enviar seu generate_output para:

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

$/ define o delimitador de linha de entrada e $| torna a saída sem buffer.

    
por 06.10.2015 / 20:05
1

Aqui está uma solução bash para enviar seu generate_output para:

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