Convertir linux sysuptime a fecha de formato de pozo

11

Quiero mostrar /proc/uptimeen buen formato como:

DD:HH:MM:SS

/proc/uptime dame el tiempo del sistema en segundos, ¿hay una solución estándar que convierta los segundos a este formato?

Navid Farhadi
fuente

Respuestas:

15

Aquí hay una manera sin perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime
mindc
fuente
1
Gran respuesta. \n ¡para nueva línea sería bueno!
ankit7540
4

Puede hacer esto, por ejemplo, con perl y algunas matemáticas 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 no necesita los segundos, simplemente puede ejecutar el uptimecomando. Su salida se puede transformar simplemente en DD: HH: MM.

Por ejemplo, usando (funciona de esta manera solo si el tiempo de actividad es> 1 h)

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

No, porque no es realmente un problema difícil. Divide el número de segundos entre 86400 usando la división de enteros para obtener el número de días. Tome el resto y divídalo entre 3600 para obtener la cantidad de horas. Divide el resto de eso por 60 para obtener la cantidad de minutos, y te queda la cantidad de segundos. Todo esto se puede hacer desde el shell utilizando el exprcomando si su shell es lo suficientemente antiguo como para no admitir la aritmética de forma nativa

Tomar el número de segundos desde la época y convertirlo en una fecha legible por humanos es un problema difícil, por lo que hay formas estándar de hacerlo, por ejemplo, date -r SECONDSdesde el shell. Pero ese es un problema diferente.

Kyle Jones
fuente
3

Adaptando la parte relevante de esta respuesta .

Mientras su tiempo de actividad sea inferior a un año, puede usar el siguiente comando:

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

Extraigo el primer campo del archivo de tiempo de actividad, ya que al menos en mi Linux, hay un segundo campo que contiene el tiempo de inactividad total. Trato eso como el número de segundos desde la época, y lo convierto al día del año seguido de tiempo en horas, minutos y segundos. Como el día del año comienza en uno, resto uno de eso en mi awkinvocación final .

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

Convertir segundos desde época a una fecha y hora:

$ 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
fuente