![¿Puede anteponer a cada línea escrita con tee la fecha y hora actuales?](https://rvso.com/image/1520722/%C2%BFPuede%20anteponer%20a%20cada%20l%C3%ADnea%20escrita%20con%20tee%20la%20fecha%20y%20hora%20actuales%3F.png)
Estoy usando el comando 'tee' para capturar los resultados de un comando bash largo en un archivo.
¿Puede el archivo que emito con tee anteponer de alguna manera cada línea la marca de tiempo de cuando se escribió la línea? Estoy buscando una solución en la que cada línea tenga un valor de fecha y hora diferente... no el mismo valor precedido en cada línea.
La razón por la que quiero esto es que sería muy útil saber cuándo se emitió cada línea más adelante cuando lea el archivo para entender dónde estaban las áreas lentas.
Respuesta1
Si no puede hacer algo, canalícelo a un programa que lo haga.másutilstiene una herramienta llamada ts
cuyo propósito es exactamente este:
$ prueba de eco | ts 02 de febrero 13:17:27 prueba
Si quieres marcar la horatodo, el uso debería ser obvio:
myapp | ts | tee app.log
Son posibles otras combinaciones; por ejemplo, para marcar la hora solo la salida de la pantalla o solo el archivo de registro:
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"
(Sí, este último también es de moreutils).
Respuesta2
Una alternativa a ts
:
echo "foo" | stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/foo.log"
Producción:
# cat "/tmp/foo.log"
2022-02-24 09:43:00 foo
Ejemplo para registrar stdout y stderr en un archivo (eliminar /dev/null
también para escribir en la terminal):
exec &> >(stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/std.log" >/dev/null )
Otra alternativa usando awk
:
echo "foo" | xargs -d'\n' -I{} echo '{}' | awk '{ print strftime("%F %T"), $0; fflush(); }' | tee -a "/tmp/foo.log"