Coloque um texto na frente de cada nova linha que um programa imprime para stdout

8

Então eu quero fazer alguns registros e, por isso, quero colocar uma data na frente da saída de um script bash. O problema é que tem várias linhas de saída. Eu só posso colocar a data antes de toda a saída. Mas então eu tenho uma linha sem uma data nos logs. É claro que posso supor que a data da linha acima é a mesma, mas esperava que houvesse uma solução. Obrigado antecipadamente!

Este é o meu script que chama outro script:

#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended

Esta é a saída:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended

E é isso que eu gostaria de ter:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended
    
por tzippy 26.07.2012 / 16:30

4 respostas

8

De acordo com uma pergunta semelhante no Stack Overflow , existem duas ótimas opções.

awk ( Resposta )

<command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

anote ( Resposta )

anotar é um pequeno script bash, que pode ser obtido diretamente pelo link fornecido aqui, ou, em sistemas baseados em Debian, através do pacote devscripts (na forma de annotate-output ).

    
por 23.05.2017 / 14:41
3

Eu acho que você pode usar o awk para isso:

./script.sh | awk '{ print strftime()" : "$0; }'

(consulte link para formatar a data retornada por strftime ())

    
por 26.07.2012 / 16:39
2

Você pode usar awk

./script.sh | awk '{ print d,$1}' "d=$(date "+%F %T")"

awk recebe um fluxo de entrada e modifica sua saída. Este script está dizendo "print d seguido pela saída original", depois preenche d com a data.

    
por 26.07.2012 / 16:41
1

Isso imprimirá a data e a hora atuais antes de cada linha de saída de ./script.sh :

set -f
./script.sh | while read -r LINE; do echo $(date "+%F %T") : "$LINE"; done
set +f

Como funciona

  • set -f desativa a expansão bash (ou echo * não imprime um asterisco real).

  • while read -r LINE; do ... done salva uma linha de saída na variável $LINE e executa ... , até que todas as linhas sejam processadas.

  • echo $ (data "+% F% T"): "$ LINE" imprime a linha com a hora e a data atuais.

  • set +f volta a ativar a expansão, por isso não irá interferir com o resto do seu script bash.

por 26.07.2012 / 16:36

Tags