Como escrever em um arquivo e, enquanto o arquivo ainda está sendo escrito, leia e analise seu conteúdo usando um script de shell?

2

Na verdade, estou tentando escrever um script de shell que registra a saída de um comando em um arquivo, mas como o comando demora muito para ser concluído (cerca de 15 minutos), gostaria de começar a analisar a saída do arquivo. comando (conteúdo do arquivo) antes que o comando seja concluído, para que eu possa enviar mensagens para a saída padrão (o usuário), como:

10% complete
45% complete

e assim por diante.

Etapas do programa

  1. Redireciona o comando para um arquivo: $ (comando) > $ FILE
  2. Comece a ler e analisar a saída ($ FILE) antes que o comando seja concluído.

Eu pensei em usar programação paralela, mas ainda não peguei o jeito.

    
por Isabelle 17.03.2010 / 11:48

4 respostas

1

Na verdade, resolvi o problema usando tail e a pergunta sobre estouro de pilha Finalizando o tail -f iniciado em um shell script .

# Solution
($(command) > ${FILE}) &
tail -f --pid=$! ${FILE} | while read line
do
      echo $line
      # Can parse each line output here
      # Example: send errors to log file
      if echo $line | grep -qi "error"
      then
            echo $line >> ${LOG}
      fi
done

Obrigado a todos pela ajuda.

    
por 17.03.2010 / 16:01
0

tail -f irá seguir o arquivo que está sendo criado.

tente com um arquivo de log.

tail -f / var / log / messages por exemplo.

você verá o arquivo de log enviado para o console como eles aparecem no log.

    
por 17.03.2010 / 11:53
0

Pipes, Tee e Tail (sendo o tee o cerne da questão enquanto duplicava a saída padrão. Se sed fosse o arquivo que você estava usando para analisar os dados, um exemplo seria:

kbrandt@k$ a=0; while [[ a -lt 10 ]]; do
> echo foo; a=$(( $a + 1));
> done | tee -a unprocessed | sed 's/foo/bar/' > processed
kbrandt@kbrandt$ cat unprocessed 
foo
foo
foo
...
kbrandt@kbrandt$ cat processed 
bar
bar
...

Você pode executá-lo como um trabalho e processá-lo, ou apenas tail -f processed em outra janela.

    
por 17.03.2010 / 13:53
0

Use o tail and pipe em seu analisador.

    
por 17.03.2010 / 11:50