web-dev-qa-db-fra.com

Format personnalisé pour la commande time

J'aimerais utiliser la commande time dans un script bash pour calculer le temps écoulé du script et l'écrire dans un fichier journal. J'ai seulement besoin du temps réel, pas de l'utilisateur et du système. J'en ai aussi besoin dans un format décent. Par exemple, 00: 00: 00: 00 (pas comme la sortie standard). J'apprécie n'importe quel conseil.

Le format attendu est supposé être 00:00:00.0000 _ (millisecondes) [heures]: [minutes]: [secondes]. [millisecondes]

J'ai déjà 3 scripts. J'ai vu un exemple comme celui-ci:

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

Mais je n'ai besoin que du temps réel, pas de l'utilisateur et du système. J'en ai aussi besoin dans un format décent. par exemple 00:00:00:00 (pas comme la sortie standard).

En d'autres termes, j'aimerais savoir comment transformer la sortie de temps en quelque chose de plus facile à traiter.

68
John Doe

Vous pouvez utiliser la commande date pour obtenir l'heure actuelle avant et après l'exécution du travail à chronométrer et calculer la différence de la manière suivante:

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

Notes: $ ((...)) peut être utilisé pour l'arithmétique de base dans bash - attention à ne pas mettez des espaces avant un moins - , car cela pourrait être interprété comme une option de ligne de commande.

Voir aussi: http://tldp.org/LDP/abs/html/arithexp.html

EDIT:
De plus, vous pouvez jeter un oeil à sed pour rechercher et extraire des sous-chaînes de la sortie générée. par temps .

EDIT:

Exemple de minutage avec millisecondes (en réalité nanosecondes, mais tronqué ici en millisecondes). Votre version de date doit prendre en charge le %N format et bash devraient prendre en charge les grands nombres.

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

AVERTISSEMENT:
Ma version originale disait

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

mais cela a été supprimé parce que cela n'a apparemment pas fonctionné pour certaines personnes alors que la nouvelle version aurait fonctionné. Je n'approuvais pas cela parce que je pense que vous devez utiliser uniquement le reste mais vous avez été mis aux voix.
Choisissez ce qui vous convient.

87
Archimedix

Depuis le page de manuel pour time :

  1. Il peut y avoir un temps appelé Shell intégré, évitez cela en spécifiant /usr/bin/time
  2. Vous pouvez fournir une chaîne de format et l'une des options de format est le temps écoulé - par exemple. %E

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

Exemple:

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

Pour utiliser le construit Bash time plutôt que /bin/time vous pouvez définir cette variable:

TIMEFORMAT='%3R'

qui produira le temps réel qui ressemble à ceci:

5.009

ou

65.233

Le nombre spécifie la précision et peut aller de 0 à 3 (valeur par défaut).

Vous pouvez utiliser:

TIMEFORMAT='%3lR'

pour obtenir une sortie qui ressemble à:

3m10.022s

Le l (ell) donne un format long.

39
Dennis Williamson

Utilisez la variable intégrée bash SECONDS. Chaque fois que vous référencez la variable, elle renverra le temps écoulé depuis l'appel du script.

Exemple:

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

Sortie:

Start 0
Middle 10
End 20
29
Ed Lucero

Pas tout à fait sûr de ce que vous demandez, avez-vous essayé:

time yourscript | tail -n1 >log

Edit: ok, donc vous savez comment obtenir le temps imparti et vous voulez juste changer le format. Cela vous aiderait si vous décriviez le format que vous voulez, mais voici quelques choses à essayer:

time -p script

Cela modifie la sortie à une fois par ligne en secondes avec des décimales. Vous voulez seulement le temps réel, pas les deux autres, donc pour obtenir le nombre de secondes, utilisez:

time -p script | tail -n 3 | head -n 1
2
Andrew