![Você pode prefixar cada linha escrita com tee com a data e hora atuais?](https://rvso.com/image/1520722/Voc%C3%AA%20pode%20prefixar%20cada%20linha%20escrita%20com%20tee%20com%20a%20data%20e%20hora%20atuais%3F.png)
Estou usando o comando 'tee' para capturar os resultados de um comando bash longo em um arquivo.
O arquivo que emito com tee pode de alguma forma prefixar cada linha com o carimbo de data e hora de quando a linha foi escrita? Estou procurando uma solução em que cada linha tenha um valor de data e hora diferente... não o mesmo valor prefixado em cada linha.
A razão pela qual quero isso é que seria muito útil saber quando cada linha foi emitida posteriormente, quando eu ler o arquivo para entender onde estavam as áreas lentas.
Responder1
Se tee não puder fazer alguma coisa, canalize-o para um programa que o faça.maisutilstem uma ferramenta chamada ts
cuja finalidade é exatamente esta:
$ teste de eco | ts 02 de fevereiro 13:17:27 teste
Se você quiser registrar a data e horatudo, o uso deve ser óbvio:
myapp | ts | tee app.log
Outras combinações são possíveis; por exemplo, para registrar a data e hora apenas na saída da tela ou apenas no arquivo de log:
myapp | tee app.log | ts
myapp | tee >(ts > app.log)
myapp | tee /dev/tty | ts > app.log
myapp | pee "ts > app.log" "cat"
myapp | pee "cat > app.log" "ts"
(Sim, esse último também é de moreutils.)
Responder2
Uma alternativa para ts
:
echo "foo" | stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/foo.log"
Saída:
# cat "/tmp/foo.log"
2022-02-24 09:43:00 foo
Exemplo para registrar stdout e stderr em um arquivo (remova /dev/null
para gravar no terminal também):
exec &> >(stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/std.log" >/dev/null )
Outra alternativa usando awk
:
echo "foo" | xargs -d'\n' -I{} echo '{}' | awk '{ print strftime("%F %T"), $0; fflush(); }' | tee -a "/tmp/foo.log"