2010-09-10 16 views
65

Vorrei utilizzare il comando tempo in uno script di bash per calcolare il tempo trascorso dello script e scriverlo in un file di registro. Ho solo bisogno del tempo reale, non dell'utente e del sistema. Anche bisogno in un formato decente. ad esempio 00: 00: 00: 00 (non come lo standard output). Apprezzo qualsiasi consiglio.Formato personalizzato per il comando orario

Il formato previsto doveva essere 00:00:00.0000 (millisecondi) [ore]: [minuti]: [secondi] [millisecondi]

ho già 3 script.. Ho visto un esempio come questo:

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

Ma ho solo bisogno del tempo reale, non dell'utente e del sistema. Anche bisogno in un formato decente. ad esempio 00:00:00:00 (non come lo standard output).

In altre parole, mi piacerebbe sapere come trasformare l'output del tempo in qualcosa di più semplice da elaborare.

+1

Nuovo [tag: bash] versioni (> = 4.2) offrono un 'syntaxe printf' per questo:' printf -v TimeStamp "% (% s) T "-1" e 'printf"% (% a% d% b% Y% T) T \ n "$ TimeStamp' i valori potrebbero essere' -1': ora, '-2': Inizio di bash session, 'Integer': Unix timestamp –

+1

Per * tempo trascorso * (sotto Linux) in ** nanosecondi **, ho scritto una [funzione] (http: //www.f-hauri.ch/vrac/cours_truc-et-astuces_2012-04-03/elap.bash). Puoi trovare spiegazioni [qui] (http://stackoverflow.com/a/14110859/1765658). –

risposta

86

è possibile utilizzare il comando date per ottenere l'ora corrente, prima e dopo l'esecuzione dei lavori da cronometrato e calcolare la differenza in questo modo:

#!/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))"" 

Note: $ ((...)) può essere utilizzato per l'aritmetica di base in bash – attenzione: non inserire spazi prima di un segno meno - poiché ciò potrebbe essere interpretato come un'opzione della riga di comando.

Consulta anche: http://tldp.org/LDP/abs/html/arithexp.html

EDIT:
Inoltre, si consiglia di dare un'occhiata a sed per cercare ed estrarre sottostringhe dalla output generato da tempo.

EDIT:

Esempio di temporizzazione con millisecondi (in realtà nanosecondi ma troncato millisecondi qui). La tua versione di date deve supportare il formato %N e bash dovrebbe supportare numeri grandi.

# 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}" 

NOTA BENE:
La mia versione originale ha detto

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

ma questo è stato modificato fuori perché a quanto pare non ha funzionato per alcune persone, mentre la nuova versione come riferito ha fatto. Non l'ho approvato perché penso che devi usare solo il resto ma è stato messo in minoranza.
Scegli quello che fa per te.

+0

Sembra non corretto: Tempo in secondi: 46 (OK), Formato carino: 00: 00: 00: 46 (errato). Usando il comando time: reale 0m46.018s utente 0m7.630 sys 0m1.190s –

+0

Hm, non sono del tutto sicuro di cosa 00: 00: 00: 00 si supponga significasse – Immagino che significasse [giorni]: [ore] : [minuti]: [secondi]? Questo è ciò che mostra, ma sei libero di regolare il codice per calcolare ciò di cui hai bisogno. – Archimedix

+0

scuse per l'errore di battitura. Dovrebbe essere 00: 00: 00.0000 (millisecondi) [ore]: [minuti]: [secondi]. [Millisecondi] –

2

Non del tutto sicuro di quello che stai chiedendo, hai provato:

time yourscript | tail -n1 >log 

Edit: ok, in modo da sapere come ottenere i tempi di fuori e si desidera solo per cambiare il formato. Sarebbe d'aiuto se hai descritto quale formato si desidera, ma qui ci sono alcune cose da provare:

time -p script 

Questo cambia l'output in una sola volta per linea in pochi secondi con decimali. Si vuole solo il tempo reale, non gli altri due in modo da ottenere il numero di secondi uso:

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

Voglio includerlo nel mio script. –

+0

Sì, se ciò non fosse ambiguo, non vorrei sottolineare che è necessario un chiarimento. Perché non usare due script, uno che chiama l'altro? – Amoss

+0

Perché ho già 3 script. vidi un esempio come questo: {{tempo codice # sezione va qui }} 2> timing.log ma ho solo bisogno di tempo reale, non l'utente e SYS. Anche bisogno in un formato decente. ad esempio 00: 00: 00: 00 (non come lo standard output). –

37

Dal man page for time:

  1. ci può essere un guscio di built-in chiamato tempo, evitare questo specificando /usr/bin/time
  2. È possibile fornire una stringa di formato e una delle opzioni di formato è il tempo trascorso - ad es. %E

    /usr/bin/time -f'%E' $CMD

Esempio:

$ /usr/bin/time -f'%E' ls /tmp/mako/ 
res.py res.pyc 
0:00.01 
+2

Ecco perché il comando: time -f '% E' non funzionava, ma/usr/bin/time -f '% E' funziona correttamente. Thx –

+2

Su OS X, 'time' non ha un flag -f. Puoi risolvere questo problema installando coreutils usando [brew] (http://brew.sh) ('brew install coreutils') e poi usa'/usr/local/bin/gtime'. – CousinCocaine

29

Per utilizzare la Bash incorporato time piuttosto che /bin/time è possibile impostare questa variabile:

TIMEFORMAT='%3R' 

che sarà in uscita in tempo reale che assomiglia a questo:

5.009 

o

65.233 

Il numero specifica la precisione e può variare da 0 a 3 (default).

È possibile utilizzare:

TIMEFORMAT='%3lR' 

per ottenere l'output che assomiglia:

3m10.022s 

Il l (elle) dà un formato lungo.

29

Utilizzare la variabile incorporata di bash SECONDS. Ogni volta che fai riferimento alla variabile, verrà restituito il tempo trascorso dall'invocazione dello script.

Esempio:

echo "Start $SECONDS" 
sleep 10 
echo "Middle $SECONDS" 
sleep 10 
echo "End $SECONDS" 

uscita:

Start 0 
Middle 10 
End 20 
+6

Non esiste una variabile più precisa? Buoni script corrono veloci ... –

Problemi correlati