Então, eu quero fazer um log e, portanto, colocar uma data na frente da saída de um script do bash. O problema é que possui várias linhas de saída. Só consigo colocar a data antes de toda a saída. Mas então eu tenho uma linha sem uma data nos logs. É claro que posso assumir que a data da linha acima é a mesma, mas eu esperava que houvesse uma solução. Desde já, obrigado!
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
Respostas:
De acordo com uma pergunta semelhante no Stack Overflow , existem 2 ótimas opções.
awk ( resposta )
anotar ( resposta )
annotate é um pequeno script bash, que pode ser obtido diretamente através do link fornecido aqui ou, em sistemas baseados no Debian, através do pacote
devscripts
(na forma deannotate-output
).fonte
Eu acho que você pode usar o awk para isso:
(consulte http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html para formatar a data retornada por strftime ())
fonte
awk: calling undefined function strftime
- isso é específicogawk
?Você pode usar
awk
awk
pega um fluxo de entrada e modifica sua saída. Esse script está dizendo "imprima d seguido da saída original" e preenchad
com a data.fonte
date
expressão apenas uma vez também, para que todas essas linhas sejam impressas ao mesmo tempo?Isso imprimirá a data e a hora atuais antes de cada linha de saída de
./script.sh
:Como funciona
set -f
desativa a expansão do bash (ouecho *
não imprimiria um asterisco real).while read -r LINE; do ... done
salva uma linha de saída na variável$LINE
e é executada...
, até que todas as linhas sejam processadas.eco $ (data "+% F% T"): "$ LINE" imprime a linha com a hora e a data atuais.
set +f
ativa novamente a expansão do bash, para que não interfira no restante do script do bash.fonte
sed
insira a mesma data, imediatamente antes de iniciar o segundo script. Provavelmente não o que o usuário quer ...ls
. Apenas tente seu script com o seguintescript.sh
:#!/bin/bash
(nova linha)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
read
com umwhile
loop em vez de um loop for.