Sie können den Befehl date
zum Konvertieren von Zeitstempeln verwenden. Es ist bedauerlich, dass Ihre Zeitstempel keine Daten auf ihnen haben, nicht sicher, was passiert, wenn Sie nach Mitternacht rollen, aber vorausgesetzt, Sie haben dieses Problem nicht, können Sie das Berechnungsdatum "01-Jan-1970 UTC" wählen .
Hier ist der Code:
paste downtime.txt uptime.txt | while read d u; do echo $(($(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s))); done
Erläuterung: Der date
Befehl wandelt die Zeitstempel in Sekunden. Die Option -d
bedeutet, dass statt "jetzt" das folgende Datum gilt. Daher geben wir Ihnen ein Datum mit Ihren Eingabedateien, wobei wir davon ausgehen, dass die angegebenen Zeiten Mitternacht sind. Da date
auf der Basis von Sekunden seit 01. Januar 1970 UTC 00:00:00 arbeitet, fügen wir dieses Datum hinzu, um das Ergebnis zu vereinfachen. Der +%s
Parameter bedeutet, sagen Sie mir, wie viele Sekunden es seit 01.01.1970 ist. Hier kommt die Konvertierung ins Spiel. Da wir -d
angegeben haben, wird der von Ihnen angegebene Zeitstempel anstelle von "jetzt" verwendet. Also ist der Wert $(date -d "01-Jan-1970 UTC $u" +%s)
die Anzahl der Sekunden seit Mitternacht für die Betriebszeit. Dann subtrahieren wir die Sekunden für die Ausfallzeit von den Sekunden für die Betriebszeit unter Verwendung von $((...))
, um die Anzahl der Sekunden zwischen den zwei Zeitstempeln zu erhalten. (Wenn Ihre Bash diese Funktion nicht hat, können Sie stattdessen $(expr $(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s))
verwenden).
UPDATE: Ich sollte den Job beenden. Zum Sammeln und Zählen der Gesamtzeit können Sie | awk '{total=total+$1} END {print $total}'
hinzufügen. Um dies wieder in Stunden und Minuten zu konvertieren, verwenden Sie erneut date
; Verwenden Sie die Option -u
, um die Konvertierung in die lokale Zeit zu verhindern, die -d
Option mit @
, um die Anzahl der Sekunden anzugeben (wir verwenden wieder 01-Jan-1970 als Basis, @
bedeutet) und +%T
in Stunden und Minuten zu konvertieren, Wenn es jedoch mehr als 24 Stunden dauert, werden Sie die zusätzlichen Tage verlieren.
date -u -d @$(paste downtime.txt uptime.txt | while read d u; do echo $(($(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s))); done | awk '{total=total+$1} END {print total}') +%T
Setzen Sie Ihren Code mit vier weißen Leerzeichen voran. Bitte werfen Sie einen Blick auf [editing-help] (http://stackoverflow.com/editing-help). – Cyrus
Haben Sie keine Datumskomponente in Ihren Zeitstempeln? – codeforester