2016-06-04 7 views
0

Ich möchte in meinem Skript die Dauer eines Befehls anzuzeigen. Abhängig von der Dauer möchte ich so etwas haben: 12 minutes 04 seconds oder 01 hours 15 minutes 02 seconds. Immer mit einer führenden Null.berechnen Zeit (h: m: s oder m: s) Unterschied in bash

Ich habe versucht, verschiedene Dinge, die ich here gefunden, aber nicht das Ergebnis.

BTW: das ist mein erster Versuch in der Bash.

Antwort

1
#!/bin/bash 
DATE1=$(date +%s) 
# ... your commands 
DATE2=$(date +%s) 
DIFF=$(awk -vdate1=$DATE1 -vdate2=$DATE2 'BEGIN{print strftime("%H hour %M minutes %S seconds",date2-date1,1)}') 
echo $DIFF 

Die Zeit wird in Sekunden umgewandelt und in Variablen DATE1 und DATE2 Voraussetzung DATE2> DATE1

DATE1=$(date +%s) 
# ... your commands 
DATE2=$(date +%s) 

Strftime wird zeit diff in Sekunden gespeichert verwendet und formatiert zu bekommen 1 als drittes Argument als UTC Flag übergeben

strftime("%H hour %M minutes %S seconds",date2-date1,1) 
+0

Vielen Dank für die Hilfe. ich habe versucht, verschiedene Versionen und dies ist für mich: ' START_TIME = $ (Datum + "% s") # tun, um meine Befehle end_time = $ (Datum + "% s") Dauer = $ (($ end_time- $ start_time)) Stunden = $ (printf '% 02d' "$ (($ du Ration/3600)) ") Minuten = $ (printf '% 02d' "$ ((($ duration% 3600)/60))") Sekunden = $ (printf '% 02d'" $ (($ duration% 60)) ") if [$ Stunden -eq 0] dann com_time = $ (printf "$ Minuten: $ Sekunden Minuten") sonst com_time = $ (printf "$ Stunden: $ Minuten Stunden") fi ' – Gurkenglas

0

könnten Sie die time verwenden ausführbare Datei (nicht die bash gebautet weil das externe Programm verfügt über die Formatoption -f und liefert die Zeit als [hours:]minutes:seconds und ich bin jetzt nicht in der Stimmung, eine Stunde zu warten, um herauszufinden, wie das Builtin zeigt uns die Stunden :)) und awk wie dies (am Beispiel sleep 2):

/usr/bin/time -f "%E" sleep 2 2> >( 
    awk -F : ' 
    { if(FN>2) printf("%02d hours %02d minutes %02d seconds\n", $1, $2, $3) 
     else printf("%02d minutes %02d seconds\n", $1, $2) 
    }' 
) 

Hier verwenden wir /usr/bin/time mit seiner -f Option. Dann leiten wir die Ausgabe von stderr in awk die Zeichenfolge bei : teilen. (Zeit schreibt in stderr, so müssen wir die 2> stderr in die >(awk ...) Filter umleiten.

Die awk Filter entscheidet über die Anzahl der Felder in NF welche printf Aussage es verwendet.

+0

Das klingt cool. Mein Befehl zum Überprüfen der Zeit ist mehrere Zeilen lang. In Ihrem Beispiel nur "Schlaf 2". Wie kann ich meinen Befehl in eigenen Zeilen hinzufügen? – Gurkenglas

+0

@Gurkenglas: erste Idee: setze deine Befehle in ein eigenes Skript und zeit das Skript; zweite Idee: Verwenden Sie Chets-Lösung. Ich habe versucht, 'cmd1; cmd2' in den Schlafplatz und '(cmd1; cmd2)'; Nichts hat geklappt. –

Verwandte Themen