Pipe stdout para o comando no stdout

0

Se eu tivesse um processo em execução como tail -F watch.txt e eu quisesse capturar o stdout desse processo em execução e canalizá-lo para outro comando no stdout, como isso poderia ser feito?

Veja um exemplo de um processo em execução.

$ tail -F watch.txt
foo
bar
baz

Digamos que eu queira capturar o stdout e escrever um novo arquivo para cada um deles ou processar cada sequência com outro comando. Por exemplo, existe esse comando terminal-notifier (mac specific) que recebe uma mensagem terminal-notifier --message "$STDOUT_FROM_TAIL" .

Isso é possível com coisas que já existem no unix?

    
por ThomasReggi 12.12.2014 / 00:45

1 resposta

1

Supondo que você pode reiniciar o programa e colocá-lo em um pipe, você pode canalizá-lo para xargs , com as seguintes ressalvas:

  • você deseja executar o comando uma linha por vez (-n 1)
  • você quer colocar a saída dentro de um parâmetro (-i)
  • você provavelmente quer que a mensagem seja executada assim que o tail reportar, então você precisa de tail para ser linha em buffer .

Dependendo do que você instalou:

stdbuf -o 0 tail -f FILE | xargs -i -n 1 terminal-notifier --message "{}"

unbuffer    tail -f FILE | xargs " "

e eu vi uma versão tailf que suportava a opção -l (line-buffered).

Você também pode emular tail -f em Perl.

E você pode substituir xargs (mesmo que seja padrão e onipresente) por um loop for especialmente criado no shell (mas não é tão simples quanto parece; é semelhante para processar nomes de arquivos com espaços em um loop).

Se você não puder reiniciar o programa, precisará interceptar sua stdout. Aqui está uma resposta de estouro de pilha sobre isso. Outros utilitários e scripts, como reredirect , são descritos aqui ; Eu não sei sobre a compatibilidade deles com o MacOS.

Modificações adicionais

A saída pode ser analisada normalmente com utilitários como sed ou cut:

cauda sem buffer -f FILE | grep animal | sed-e / animal (. *) engrenagem / \ 1 / '| xargs ...

Dessa forma, teríamos:

Output by tail                      output by grep        output by sed
correct horse battery staple
animal rhino gear                   animal rhino gear     rhino
llama is animal                     llama is animal       llama is animal
llama peruvian                      
animal ant gearbox                  animal ant gearbox    antbox

( --line-buffered opção para grep pode ser usada)

    
por 12.12.2014 / 01:07