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?

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

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'

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.