2017-01-31 5 views
0

Ich habe ein Skript, das überprüft meine Protokolle für die Zeitstempel der, wenn die Anwendung heruntergefahren und gesichert wurde (Verfügbarkeit der App).
Ich möchte den Unterschied zwischen einer Liste von Zeitstempeln finden und dann alle diese Unterschiede addieren, so dass ich eine Gesamtmenge an Zeit kenne, die die App heruntergekommen war. So ist die downtime.txt Datei hat eine Liste wie folgt aus:
04:55:51
05:41:51
und die uptime.txt hat eine Liste wie das gleiche Format:
04:56:59
05:42:21Subtrahieren zwei Listen von Zeitstempeln voneinander in bash

Wenn ich nicht die Zeitstempel in Zahlen für Arithmetik konvertieren musste, denke ich, ich könnte
einfügen downtime.txt uptime.txt | awk '{print $ 1 - $ 2}'> timedown.txt
oder so ähnlich. Wie kann ich die Zeitstempel lesen, in eine Zahl umwandeln, die übereinstimmenden Zeilen von den zwei Dateien subtrahieren und dann alle Summen aus diesen Zeilen addieren?

+0

Setzen Sie Ihren Code mit vier weißen Leerzeichen voran. Bitte werfen Sie einen Blick auf [editing-help] (http://stackoverflow.com/editing-help). – Cyrus

+0

Haben Sie keine Datumskomponente in Ihren Zeitstempeln? – codeforester

Antwort

0

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 
+1

Ich endete mit awk, um die Stunden mit 3600 und die Minuten mit 60 zu multiplizieren und addieren sie, aber ich mag den Datumsbefehl. Ich habe ursprünglich den Zeitstempel isoliert, aber ich kann mein Skript auch das Datum enthalten, so dass es Dinge vor und nach Mitternacht protokollieren kann. Danke für die Zeit, die du mir gegeben hast! – rensozo