Como faço para produzir stdout e stderr e gravá-los em um arquivo? [duplicado]

1

Eu basicamente quero escrever minhas estatísticas de ping em um arquivo. Até agora, eu consegui isso com ping adress | awk '{ print strftime("[%d.%m.%Y %H:%M:%S]"), $0}' > textfile , mas seria mais prático poder olhar para a saída sem ter que interromper o processo antes. Eu também estou ciente de que este comando não escreve stderr no meu arquivo de texto. Eu criei essa parte enquanto escrevia esta questão.

O comando ou script deve basicamente se comportar assim:

$ command > textfile [15.08.2017 00:17:07] PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. [15.08.2017 00:17:07] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=11.5 ms [15.08.2017 00:17:08] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=11.5 ms ^C $ cat textfile [15.08.2017 00:17:07] PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. [15.08.2017 00:17:07] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=11.5 ms [15.08.2017 00:17:08] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=11.5 ms

    
por Boris 15.08.2017 / 00:03

1 resposta

3

Altere seu comando para isto:

ping address 2>&1 | awk '{ print strftime("[%d.%m.%Y %H:%M:%S]"), $0}' | tee textfile

2>&1 redireciona stderr para stdout que vai para awk . tee permite que você tenha a saída na sua tela e no arquivo que você especificou.

Você pode ficar incomodado com awk armazenando em buffer sua saída, que será exibida por blocos. Então use:

awk '{ print strftime("[%d.%m.%Y %H:%M:%S]"), $0; fflush()}'

ou:

stdbuf -oL awk '{ print strftime("[%d.%m.%Y %H:%M:%S]"), $0}'
    
por 15.08.2017 / 00:19