Konvertieren Sie die Linux-Systemzeit in ein gut formatiertes Datum

11

Ich möchte in gutem /proc/uptimeFormat anzeigen als:

DD:HH:MM:SS

/proc/uptime Gib mir die Systemzeit in Sekunden. Gibt es eine Standardlösung, die Sekunden in dieses Format konvertiert?

Navid Farhadi
quelle

Antworten:

15

Hier ist ein Weg ohne perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime
mindc
quelle
1
Gute Antwort. \n für newline wäre gut!
ankit7540
4

Sie können dies zum Beispiel mit Perl und einigen einfachen Berechnungen tun:

cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%3600)/60),$1%60' 

Wenn Sie die Sekunden nicht benötigen, können Sie den uptimeBefehl einfach ausführen . Seine Ausgabe kann dann einfach in DD: HH: MM umgewandelt werden.

Zum Beispiel mit (funktioniert nur so, wenn die Betriebszeit> 1 Stunde ist)

 uptime | perl -ne '/(\d*) day[^\d]*(\d*):(\d*)/ ; printf "%02d:%02d:%02d\n", $1, $2, $3'
Jofel
quelle
3

Nein, weil es kein wirklich schweres Problem ist. Teilen Sie die Anzahl der Sekunden durch 86400 mithilfe der Ganzzahldivision, um die Anzahl der Tage zu erhalten. Nehmen Sie den Rest und teilen Sie ihn durch 3600, um die Anzahl der Stunden zu erhalten. Teilen Sie den Rest durch 60, um die Anzahl der Minuten zu erhalten, und Sie haben die Anzahl der Sekunden übrig. All dies kann von der Shell aus mit dem exprBefehl ausgeführt werden, wenn Ihre Shell alt genug ist, um Arithmetik nicht nativ zu unterstützen

Es ist ein schwieriges Problem, die Anzahl der Sekunden seit der Epoche zu nehmen und daraus ein von Menschen lesbares Datum zu machen. Daher gibt es Standardmethoden, um dies zu tun, z date -r SECONDS. B. von der Shell aus. Aber das ist ein anderes Problem.

Kyle Jones
quelle
3

Anpassung des relevanten Teils dieser Antwort .

Solange Ihre Betriebszeit weniger als ein Jahr beträgt, können Sie den folgenden Befehl verwenden:

TZ=UTC date -d@$(cut -d\  -f1 /proc/uptime) +'%j %T' | awk '{print $1-1"d",$2}'

Ich extrahiere das erste Feld der Uptime-Datei, da zumindest unter Linux ein zweites Feld die gesamte Leerlaufzeit enthält. Ich behandle das als die Anzahl der Sekunden seit der Epoche und rechne das in den Tag des Jahres um, gefolgt von der Zeit in Stunden, Minuten und Sekunden. Da der Tag des Jahres um eins beginnt, subtrahiere ich bei meinem letzten awkAufruf einen davon.

MvG
quelle
2
$ s=12345678
$ printf '%d:%02d:%02d:%02d\n' $((s/86400)) $((s/3600%24)) $((s/60%60)) $((s%60))
142:21:21:18

Konvertieren von Sekunden seit der Epoche in Datum und Uhrzeit:

$ gdate -d @1234567890 '+%F %T' # GNU date
2009-02-14 01:31:30
$ date -r 1234567890 '+%F %T' # BSD date
2009-02-14 01:31:30
Lri
quelle