2010-09-10 19 views
65

Me gustaría utilizar el comando time en un script bash para calcular el tiempo transcurrido del script y escribirlo en un archivo de registro. Solo necesito el en tiempo real, no el usuario ni el sistema. También lo necesito en un formato decente. e.g 00: 00: 00: 00 (no como la salida estándar). Agradezco cualquier consejo.Formato personalizado para el comando de hora

El formato esperado supone que es 00:00:00.0000 (milisegundos) [horas]: [minutos]: [segundos] [milisegundos]

ya he 3 guiones.. Vi un ejemplo como este:

{ time { # section code goes here } } 2> timing.log 

Pero solo me falta el tiempo real, no el usuario y sys. 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.

+1

New [tag: Bash] versiones (> = 4.2) ofrecen un 'syntaxe printf' para esto:' printf -v timestamp "% (% s) T "-1' y' printf "% (% a% d% b% Y% T) T \ n" Los valores de $ TimeStamp' podrían ser '-1': ahora,' -2': Inicio de sesión bash, 'Integer': marca de tiempo Unix –

+1

Durante * tiempo transcurrido * (en Linux) en ** nanosegundos **, escribí una [función] (http: //www.f-hauri.ch/vrac/cours_truc-et-astuces_2012-04-03/elap.bash). Puede encontrar explicaciones [aquí] (http://stackoverflow.com/a/14110859/1765658). –

Respuesta

86

usted podría utilizar el comando date para obtener la hora actual antes y después de realizar el trabajo a ser cronometrado 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: $ ((...)) se puede utilizar para la aritmética básica en bash – precaución: no ponga espacios antes de un menos - ya que esto podría interpretarse como una opción de línea de comandos.

Consulte también: http://tldp.org/LDP/abs/html/arithexp.html

EDIT:
Además, es posible que desee echar un vistazo a sed para buscar y extraer subcadenas de la salida generada por tiempo.

EDIT:

Ejemplo para la sincronización con milisegundos (en realidad nanosegundos pero truncado para 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 dice

M="$((T%1000000000/1000000))" 

pero esto fue editado a cabo, ya que al parecer no funciona para algunas personas, mientras que la nueva versión según se informa hizo. No aprobé esto porque creo que debes usar el resto solamente, pero se votó en mayor grado.
Elija lo que le quede bien.

+0

Parece incorrecto: tiempo en segundos: 46 (OK), formato bonito: 00: 00: 00: 46 (incorrecto). Usando el comando de tiempo: usuario real 0m46.018s 0m7.630s sys 0m1.190s –

+0

Hm, no estoy muy seguro de qué se supone que 00: 00: 00: 00 significa – Supongo que significaba [días]: [horas] : [minutos]: [segundos]? Eso es lo que muestra, pero usted es libre de ajustar el código para calcular lo que necesita. – Archimedix

+0

excusas para el error tipográfico. Se supone que es 00: 00: 00.0000 (milisegundos) [horas]: [minutos]: [segundos]. [Milisegundos] –

2

No estoy seguro de lo que estás preguntando, ¿ha intentado:

time yourscript | tail -n1 >log 

Editar: ok, para que sepa cómo conseguir los tiempos y lo que desea es cambiar el formato. Sería de gran ayuda si usted describió qué formato desea, pero aquí hay algunas cosas para probar:

time -p script 

Esto cambia la salida a una vez por la línea en cuestión de segundos con decimales. Sólo desea que el tiempo real, no los otros dos por lo que para obtener el número de segundos que utiliza:

time -p script | tail -n 3 | head -n 1 
+0

Quiero incluirlo en mi script. –

+0

Sí, si eso no fuera ambiguo, entonces no señalaría que necesita aclaración. ¿Por qué no usar dos scripts, uno que llame al otro? – Amoss

+0

Porque ya tengo 3 secuencias de comandos. vi un ejemplo como este: {{tiempo # código de la sección va aquí 2}}> timing.log Pero solo me falta el tiempo real, no el usuario y sys. También lo necesito en un formato decente. e.g 00: 00: 00: 00 (no como la salida estándar). –

37

Desde el man page for time:

  1. Puede haber una cáscara incorporado llamado tiempo, evita este 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 
+2

Es por eso que el comando: time -f '% E' no funciona, pero/usr/bin/time -f '% E' funciona bien. Thx –

+2

En OS X, 'time' no tiene un indicador -f. Puede solucionar esto instalando coreutils usando [brew] (http://brew.sh) ('brew install coreutils') y luego use'/usr/local/bin/gtime' en su lugar. – CousinCocaine

29

Para utilizar el Bash orden interna time en lugar de /bin/time puede establecer esta variable:

TIMEFORMAT='%3R' 

el cual te mostrará el tiempo real que se ve así:

5.009 

o

65.233 

El número especifica la precisión y puede variar de 0 a 3 (el valor predeterminado).

Se puede utilizar:

TIMEFORMAT='%3lR' 

para obtener una salida que se parece a:

3m10.022s 

El l (ELL) da un formato largo.

29

Utilice la variable incorporada 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" 

de salida:

Start 0 
Middle 10 
End 20 
+6

¿No hay una variable más precisa? Los buenos guiones corren rápido ... –

Cuestiones relacionadas