Entonces, quiero hacer un registro y, por lo tanto, quiero poner una fecha delante de la salida de un script bash. El problema es que tiene múltiples líneas de salida. Solo puedo poner la fecha antes de toda la salida. Pero luego tengo una línea sin fecha en los registros. Por supuesto, puedo suponer que la fecha de la línea anterior es la misma, pero esperaba que hubiera una solución. ¡Gracias por adelantado!
Este es mi script que llama a otro script:
#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended
Esta es la salida:
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
Y eso es lo que me gustaría tener:
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
Respuestas:
Según una pregunta similar sobre Stack Overflow , hay 2 excelentes opciones.
awk ( respuesta )
anotar ( respuesta )
annotate es un pequeño script bash, que puede obtenerse directamente a través del enlace que se proporciona aquí o, en sistemas basados en Debian, a través del paquete
devscripts
(en forma deannotate-output
).fuente
Creo que puedes usar awk para esto:
(consulte http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html para formatear la fecha devuelta por strftime ())
fuente
awk: calling undefined function strftime
- ¿Esto es específico paragawk
?Puedes usar
awk
awk
toma una secuencia de entrada y modifica su salida. Este script dice "imprimir d seguido de la salida original", luego se completad
con la fecha.fuente
date
expresión solo una vez también, para que todas esas líneas se impriman al mismo tiempo?Esto imprimirá la fecha y hora actuales antes de cada línea de salida de
./script.sh
:Cómo funciona
set -f
desactiva la expansión de bash (oecho *
no imprime un asterisco real).while read -r LINE; do ... done
guarda una línea de salida en la variable$LINE
y se ejecuta...
, hasta que se procesen todas las líneas.echo $ (fecha "+% F% T"): "$ LINE" imprime la línea con la hora y fecha actuales.
set +f
vuelve a activar la expansión bash, por lo que no interferirá con el resto de su script bash.fuente
sed
inserta la misma fecha, justo antes de comenzar el segundo script. Probablemente no sea lo que el usuario quiere ...ls
. Simplemente pruebe su script con lo siguientescript.sh
:#!/bin/bash
(nueva línea)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
read
con unwhile
bucle en lugar de un bucle for.