piping tail -f em sed ou awk

2

Há outra questão que é quase a mesma, mas nenhuma das sugestões da sua resposta funciona para mim: Tubar a cauda -f no awk

Estou tentando finalizar um arquivo de log, mas quero substituir \ r por \ n antes de exibi-lo, para que o terminal não se sobrescreva, mas, em vez disso, permite que eu role pela saída.

isso funciona como suspeito:

tail -f -c 1000 "mycustom.log"

e isso também:

tail -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'

nenhum desses três porém imprime nada no meu console:

tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'
stdbuf -o0 tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'
unbuffer tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'

Para que unbuffer seja conhecido em meu sistema, tive que instalar o pacote expect-dev

usando awk ou mawk não parece fazer diferença. Eu também escrevi uma variante sed :

sed 's/\r/\n/g'

que se comporta da mesma forma para mim.

Também encontrei esta pergunta: link
Mas o parâmetro sed -u não muda nada para mim, e a construção $ '..' é identificada como erro de sintaxe pelo meu sed - mudando para \ $ '...' é executado mas com o comando tail -f não precisa imprimir nada como qualquer outra coisa que eu tentei.

Existe mais alguma coisa que eu possa tentar? É o problema que eu uso um comando global em sed / awk? Ou talvez o problema é que o fluxo original produzido por tail -f é apenas "uma linha", já que não há n \ n nele? Existe alguma maneira de fazer com que o sed ou o awk processem pedaços menores do que linha por linha?

Existe uma alternativa para substituir todos os \ r por \ n que possam funcionar com tail -f ?

    
por kaefert 04.03.2015 / 12:38

1 resposta

1

Okey, então eu encontrei a minha resposta: uma vez que meu arquivo de log se parece com uma única linha para o awk e o sed que nunca é completado (no caso do tail -f) eles nunca produzirão nada. Então, escrevi esta solução alternativa:

tail -c 1 -f "$path" | while read -r -n1 char
do
  if [ "$char" = $'\r' ] ; then
    echo ""
  else
    echo -n "$char"
  fi
done

isso é feio, mas funciona;)

ATUALIZAÇÃO: O usuário do G-Man sugeriu uma maneira muito mais agradável que funciona bem:

tail -c 1 -f "$path" | tr "\r" "\n"
    
por 04.03.2015 / 13:14