Convertir Linux Sysuptime en format bien daté

11

Je souhaite afficher /proc/uptimeau format puits comme:

DD:HH:MM:SS

/proc/uptime donnez-moi le temps du système en secondes, existe-t-il une solution standard qui convertit les secondes en ce format?

Navid Farhadi
la source

Réponses:

15

Voici un moyen sans perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime
mindc
la source
1
Très bonne réponse. \n pour newline serait bien!
ankit7540
4

Vous pouvez le faire par exemple avec perl et quelques calculs simples:

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' 

Si vous n'avez pas besoin des secondes, vous pouvez simplement exécuter la uptimecommande. Sa sortie peut alors être simplement transformée en DD: HH: MM.

Par exemple, utiliser (ne fonctionne de cette façon que si le temps de disponibilité> 1 h)

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

Non, car ce n'est pas vraiment un problème difficile. Divisez le nombre de secondes par 86400 en utilisant la division entière pour obtenir le nombre de jours. Prenez le reste et divisez-le par 3600 pour obtenir le nombre d'heures. Divisez le reste par 60 pour obtenir le nombre de minutes, et vous vous retrouvez avec le nombre de secondes. Tout cela est réalisable depuis le shell en utilisant la exprcommande si votre shell est assez ancien pour ne pas supporter nativement l'arithmétique

Prendre le nombre de secondes écoulées depuis l'époque et en faire une date lisible par l'homme est un problème difficile, et il existe donc des moyens standard de le faire, par exemple à date -r SECONDSpartir de la coque. Mais c'est un problème différent.

Kyle Jones
la source
3

Adapter la partie pertinente de cette réponse .

Tant que votre disponibilité est inférieure à un an, vous pouvez utiliser la commande suivante:

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

J'extrais le premier champ du fichier de disponibilité, car au moins sur mon Linux, il y a un deuxième champ contenant le temps d'inactivité total. Je considère cela comme le nombre de secondes écoulées depuis l'époque et je le convertis en jour de l'année suivi du temps en heures, minutes et secondes. Puisque le jour de l'année commence à un, j'en soustrais un dans mon awkinvocation finale .

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

Conversion des secondes depuis l'époque en une date et une heure:

$ 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
la source