Format personnalisé pour la commande de temps

Je voudrais utiliser la commande time dans un script bash pour calculer le temps écoulé du script et l’écrire dans un fichier journal. Je n’ai besoin que du temps réel , pas de l’utilisateur et du système. Besoin également dans un format décent. par exemple 00: 00: 00: 00 (pas comme la sortie standard). J’apprécie tout conseil.

Le format attendu devrait ê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. Besoin également dans un format décent. par exemple 00:00:00:00 (pas comme la sortie standard).

En d’autres termes, je voudrais savoir comment transformer la sortie du temps en quelque chose de plus facile à traiter.

Vous pouvez utiliser la commande date pour obtenir l’heure actuelle avant et après l’exécution du travail et calculer la différence comme suit:

 #!/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 – caution: ne placez pas d’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

MODIFIER:
En outre, vous pouvez consulter sed pour rechercher et extraire des sous-chaînes de la sortie générée par le temps .

MODIFIER:

Exemple de synchronisation en millisecondes (en fait, nanosecondes mais tronqué en millisecondes ici). Votre version de date doit prendre en charge le format %N et bash doit 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 a dit

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

mais cela a été supprimé parce que apparemment, cela ne fonctionnait pas pour certaines personnes alors que la nouvelle version aurait eu lieu. Je n’ai pas approuvé cela parce que je pense que vous devez utiliser le rest seulement, mais a été annulé.
Choisissez ce qui vous convient.

Depuis la page de manuel pour le temps :

  1. Il peut y avoir un shell intégré appelé time, évitez ceci 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 

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

 TIMEFORMAT='%3R' 

qui affichera 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.

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

Exemple:

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

Sortie:

 Start 0 Middle 10 End 20 

Vous n’êtes pas sûr de ce que vous demandez, avez-vous essayé:

 time yourscript | tail -n1 >log 

Edit: ok, donc vous savez comment obtenir les temps et vous voulez juste changer le format. Il serait utile que vous décriviez quel format vous voulez, mais voici quelques éléments à essayer:

 time -p script 

Cela change la sortie à une fois par ligne en secondes avec des décimales. Vous ne voulez que le temps réel, pas les deux autres pour obtenir le nombre de secondes d’utilisation:

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