bash - fecha - date linux set
Formato personalizado para el comando de tiempo (5)
Me gustaría utilizar el comando de tiempo en un script bash para calcular el tiempo transcurrido del script y escribirlo en un archivo de registro. Solo necesito el tiempo real , no el usuario y el sistema. También lo necesito en un formato decente. por ejemplo 00: 00: 00: 00 (no como la salida estándar). Agradezco cualquier consejo.
El formato esperado se supone que es 00:00:00.0000
(milisegundos) [horas]: [minutos]: [segundos]. [Milisegundos]
Ya tengo 3 guiones. Vi un ejemplo como este:
{ time { # section code goes here } } 2> timing.log
Pero solo necesito el tiempo real, no el usuario y el sistema. También lo necesito en un formato decente. por ejemplo 00:00:00:00
(no como la salida estándar).
En otras palabras, me gustaría saber cómo convertir la salida del tiempo en algo más fácil de procesar.
Desde la página del manual por tiempo :
- Puede haber una llamada de shell llamada time, evite esto especificando
/usr/bin/time
Puede proporcionar una cadena de formato y una de las opciones de formato es el tiempo transcurrido, por ejemplo,
%E
/usr/bin/time -f''%E'' $CMD
Ejemplo:
$ /usr/bin/time -f''%E'' ls /tmp/mako/
res.py res.pyc
0:00.01
No estoy seguro de lo que está preguntando, ¿lo intentó?
time yourscript | tail -n1 >log
Editar: bien, para que sepa cómo agotar los tiempos de espera y solo quiere cambiar el formato. Sería útil si describiera el formato que desea, pero hay algunas cosas que debe intentar:
time -p script
Esto cambia la salida a una vez por línea en segundos con decimales. Solo desea el tiempo real, no los otros dos, para obtener el número de segundos de uso:
time -p script | tail -n 3 | head -n 1
Para usar el time
incorporado de Bash en lugar de /bin/time
, puede establecer esta variable:
TIMEFORMAT=''%3R''
que generará el tiempo real que se ve así:
5.009
o
65.233
El número especifica la precisión y puede ir de 0 a 3 (valor predeterminado).
Puedes usar:
TIMEFORMAT=''%3lR''
para obtener una salida que se vea así:
3m10.022s
El l
(ell) da un formato largo.
Puede usar el comando de date
para obtener la hora actual antes y después de realizar el trabajo para que se calcule y calcular la diferencia de esta manera:
#!/bin/bash
# Get time as a UNIX timestamp (seconds elapsed since Jan 1, 1970 0:00 UTC)
T="$(date +%s)"
# Do some work here
sleep 2
T="$(($(date +%s)-T))"
echo "Time in seconds: ${T}"
printf "Pretty format: %02d:%02d:%02d:%02d/n" "$((T/86400))" "$((T/3600%24))" "$((T/60%60))" "$((T%60))""
Notas: $ ((...)) puede usarse para aritmética básica en bash - precaución: no coloque espacios antes de un signo menos , ya que esto podría interpretarse como una opción de línea de comando.
Ver también: http://tldp.org/LDP/abs/html/arithexp.html
EDITAR:
Además, es posible que desee echar un vistazo a sed para buscar y extraer subcadenas de la salida generada por el tiempo .
EDITAR:
Ejemplo de tiempo con milisegundos (en realidad nanosegundos pero truncado a milisegundos aquí). Su versión de date
debe admitir el formato %N
y bash
debe admitir números grandes.
# UNIX timestamp concatenated with nanoseconds
T="$(date +%s%N)"
# Do some work here
sleep 2
# Time interval in nanoseconds
T="$(($(date +%s%N)-T))"
# Seconds
S="$((T/1000000000))"
# Milliseconds
M="$((T/1000000))"
echo "Time in nanoseconds: ${T}"
printf "Pretty format: %02d:%02d:%02d:%02d.%03d/n" "$((S/86400))" "$((S/3600%24))" "$((S/60%60))" "$((S%60))" "${M}"
RENUNCIA:
Mi versión original dijo
M="$((T%1000000000/1000000))"
pero esto fue eliminado porque aparentemente no funcionó para algunas personas, mientras que la nueva versión supuestamente sí lo hizo. No aprobé esto porque creo que debes usar el resto solamente, pero se votó en mayor grado.
Elija lo que le quede bien.
Usa la variable integrada bash SECONDS
. Cada vez que haga referencia a la variable, devolverá el tiempo transcurrido desde la invocación del script.
Ejemplo:
echo "Start $SECONDS"
sleep 10
echo "Middle $SECONDS"
sleep 10
echo "End $SECONDS"
Salida:
Start 0
Middle 10
End 20