Converti sysuptime di Linux in una buona formattazione della data


11

Voglio visualizzare /proc/uptimein un formato ben fatto come:

DD:HH:MM:SS

/proc/uptime dammi il tempo di sistema in secondi, esiste una soluzione standard che converte i secondi in questo formato?

Risposte:


15

Ecco un modo senza perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime

1
Bella risposta. \n per newline sarebbe buono!
ankit7540,

4

Puoi farlo ad esempio con perl e alcuni semplici calcoli:

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' 

Se non hai bisogno dei secondi, puoi semplicemente eseguire il uptimecomando. Il suo output può quindi essere semplicemente trasformato in DD: HH: MM.

Ad esempio utilizzando (funziona in questo modo solo se uptime> 1h)

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

3

No, perché non è davvero un problema difficile. Dividi il numero di secondi per 86400 usando la divisione intera per ottenere il numero di giorni. Prendi il resto e dividilo per 3600 per ottenere il numero di ore. Dividi il resto per 60 per ottenere il numero di minuti e ti rimane il numero di secondi. Tutto ciò è realizzabile dalla shell usando il exprcomando se la shell è abbastanza antica da non supportare l'aritmetica in modo nativo

Prendere il numero di secondi dall'epoca e trasformarlo in una data leggibile dall'uomo è un problema difficile, e quindi ci sono modi standard per farlo, ad esempio date -r SECONDSdalla shell. Ma questo è un problema diverso.


3

Adattare la parte pertinente di questa risposta .

Finché il tempo di attività è inferiore a un anno, è possibile utilizzare il comando seguente:

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

Estraggo il primo campo del file uptime, poiché almeno sul mio Linux, c'è un secondo campo contenente il tempo di inattività totale. Lo considero come il numero di secondi dall'epoca e lo converto in giorno dell'anno seguito da tempo in ore, minuti e secondi. Poiché il giorno dell'anno inizia all'una, ne sottraggo uno nella mia awkinvocazione finale .


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

Conversione dei secondi dall'epoca in una data e ora:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.