Konwertuj czas sysuptime Linuksa na dobrze formatującą datę

11

Chcę wyświetlać /proc/uptimew dobrym formacie jako:

DD:HH:MM:SS

/proc/uptime poświęć mi czas systemu w sekundach, czy istnieje standardowe rozwiązanie, które konwertuje sekundy na ten format?

Navid Farhadi
źródło

Odpowiedzi:

15

Oto sposób bez perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime
mindc
źródło
1
Świetna odpowiedź. \n bo nowa linia byłaby dobra!
ankit7540,
4

Możesz to zrobić na przykład za pomocą Perla i prostej matematyki:

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' 

Jeśli nie potrzebujesz sekund, możesz po prostu uruchomić uptimepolecenie. Jego dane wyjściowe można następnie po prostu przekształcić na DD: GG: MM.

Na przykład używanie (działa w ten sposób tylko wtedy, gdy czas pracy> 1h)

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

Nie, ponieważ to nie jest naprawdę trudny problem. Podziel liczbę sekund przez 86400, używając podziału na liczby całkowite, aby uzyskać liczbę dni. Weź resztę i podziel ją przez 3600, aby uzyskać liczbę godzin. Podziel resztę tego przez 60, aby uzyskać liczbę minut, a pozostanie Ci liczba sekund. Wszystko to można wykonać z poziomu powłoki za pomocą exprpolecenia, jeśli jest ona wystarczająco stara, aby nie obsługiwać arytmetyki natywnie

Poświęcenie liczby sekund od epoki i przekształcenie jej w datę czytelną dla ludzi jest trudnym problemem, dlatego istnieją standardowe sposoby, aby to zrobić, np. date -r SECONDSZ poziomu powłoki. Ale to inny problem.

Kyle Jones
źródło
3

Dostosowanie odpowiedniej części tej odpowiedzi .

Dopóki twój czas pracy jest krótszy niż rok, możesz użyć następującego polecenia:

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

Wyodrębniam pierwsze pole z pliku uptime, ponieważ przynajmniej w moim Linuksie jest drugie pole zawierające całkowity czas bezczynności. Traktuję to jako liczbę sekund od epoki i przeliczam na dzień roku, a następnie czas na godziny, minuty i sekundy. Ponieważ dzień roku zaczyna się o pierwszej, odejmuję jeden z tego w moim ostatnim awkwywołaniu.

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

Konwertowanie sekund od epoki na datę i godzinę:

$ 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
źródło