uso fecha crear con comando cambiar cal archivo anterior bash shell time format

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 :

  1. Puede haber una llamada de shell llamada time, evite esto especificando /usr/bin/time
  2. 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