¿Puede anteponer a cada línea escrita con tee la fecha y hora actuales?

¿Puede anteponer a cada línea escrita con tee la fecha y hora actuales?

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 tscuyo 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/nulltambié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"

información relacionada