GNU/Linux >> Tutoriales Linux >  >> Linux

Tiempo de actividad del formato Bash para mostrar días, horas, minutos

Hice un script de shell universal, para sistemas que admiten uptime -p como Linux más nuevo y para aquellos que no, como Mac OS X.

#!/bin/sh

uptime -p >/dev/null 2>&1

if [ "$?" -eq 0 ]; then
  # Supports most Linux distro
  # when the machine is up for less than '0' minutes then
  # 'uptime -p' returns ONLY 'up', so we need to set a default value
  UP_SET_OR_EMPTY=$(uptime -p | awk -F 'up ' '{print $2}')
  UP=${UP_SET_OR_EMPTY:-'less than a minute'}
else
  # Supports Mac OS X, Debian 7, etc
  UP=$(uptime | sed -E 's/^[^,]*up *//; s/mins/minutes/; s/hrs?/hours/;
  s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/;
  s/^1 hours/1 hour/; s/ 1 hours/ 1 hour/;
  s/min,/minutes,/; s/ 0 minutes,/ less than a minute,/; s/ 1 minutes/ 1 minute/;
  s/  / /; s/, *[[:digit:]]* users?.*//')
fi

echo "up $UP"

Esencia

Respuesta de John1024 referenciada con mis propias personalizaciones.


Mi uptime produce una salida que se parece a:

$ uptime
 12:49:10 up 25 days, 21:30, 28 users,  load average: 0.50, 0.66, 0.52

Para convertir eso a su formato:

$ uptime | awk -F'( |,|:)+' '{print $6,$7",",$8,"hours,",$9,"minutes."}'
25 days, 21 hours, 34 minutes.

Cómo funciona

  • -F'( |,|:)+'

    awk divide su entrada en campos. Esto le dice a awk que use cualquier combinación de uno o más espacios, comas o dos puntos como separador de campo.

  • print $6,$7",",$8,"hours,",$9,"minutes."

    Esto le dice a awk que imprima el sexto campo y el séptimo campo (separados por un espacio) seguidos de una coma, el octavo campo, la cadena hours, el noveno campo y, por último, la cadena minutes. .

Manejo de computadoras con tiempos de actividad cortos usando sed

A partir de un reinicio, mi uptime produce una salida como:

 03:14:20 up 1 min,  2 users,  load average: 2.28, 1.29, 0.50
 04:12:29 up 59 min,  5 users,  load average: 0.06, 0.08, 0.48
 05:14:09 up  2:01,  5 users,  load average: 0.13, 0.10, 0.45
 03:13:19 up 1 day, 0 min,  8 users,  load average: 0.01, 0.04, 0.05
 04:13:19 up 1 day,  1:00,  8 users,  load average: 0.02, 0.05, 0.21
 12:49:10 up 25 days, 21:30, 28 users,  load average: 0.50, 0.66, 0.52

El siguiente sed comando maneja estos formatos:

uptime | sed -E 's/^[^,]*up *//; s/, *[[:digit:]]* users.*//; s/min/minutes/; s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/' 

Con los tiempos anteriores, esto produce:

1 minutes
59 minutes
2 hours, 1 minutes
1 day, 0 minutes
1 day,  1 hours, 0 minutes
25 days, 21 hours, 30 minutes

Cómo funciona

  • -E activa la sintaxis extendida de expresiones regulares. (En las semillas GNU más antiguas, use -r en lugar de -E )

  • s/^[^,]*up *//

    Este comando de sustitución elimina todo el texto hasta up .

  • s/, *[[:digit:]]* users.*//

    Este comando sustituto elimina el recuento de usuarios y todo el texto que le sigue.

  • s/min/minutes/

    Esto reemplaza min con minutes .

  • s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'

    Si la línea contiene una hora en el formato hh:mm, esto separa las horas de los minutos y lo reemplaza con hh hours, mm minutes .

Manejo de computadoras con tiempos de actividad cortos usando awk

uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'

En los mismos casos de prueba anteriores, esto produce:

0 days, 0 hours, 1 minutes.
0 days, 0 hours, 59 minutes.
0 days, 2 hours, 1 minutes.
1 days, 0 hours, 0 minutes.
1 days, 1 hours, 0 minutes.
25 days, 21 hours, 30 minutes.

Para aquellos que prefieren el código awk repartido en varias líneas:

uptime | awk -F'( |,|:)+' '{
    d=h=m=0;
    if ($7=="min")
        m=$6;
    else {
        if ($7~/^day/) { d=$6; h=$8; m=$9}
        else {h=$6;m=$7}
        }
    }
    {
        print d+0,"days,",h+0,"hours,",m+0,"minutes."
    }'

Solución :Para obtener el tiempo de actividad de Linux en segundos, vaya a bash y escriba cat /proc/uptime . Analice el primer número y conviértalo de acuerdo con sus requisitos.

De la documentación de RedHat:

Este archivo contiene información que detalla cuánto tiempo ha estado encendido el sistema desde su último reinicio . La salida de /proc/uptime es bastante mínimo:

350735.47 234388.90

El primero número es el número total de segundos que el sistema ha estado activo.

El Segundo número es cuánto de ese tiempo la máquina ha estado inactiva, en segundos.


Solo para completar... de qué se trata:

$ uptime -p
up 2 weeks, 3 days, 14 hours, 27 minutes

Linux
  1. Bash Convertir \xc3\x89 a É?

  2. Cómo ejecutar Cron cada 5 minutos, segundos, horas, días, meses

  3. Una forma sencilla de convertir HH:MM:SS (horas:minutos:segundos.fracciones de segundo) a segundos

  4. ¿Cómo comparar dos cadenas en formato de versión separada por puntos en Bash?

  5. Mostrar solo el nombre del directorio actual (no la ruta completa) en el indicador de bash

Variable de exportación de bash

Bash printf - Cómo imprimir una variable en Bash

Bash Shebang

Bash Scripting:cómo generar y formatear texto en Linux Shell

¿Hay alguna forma de mostrar la notificación del script bash en Ubuntu?

¿Mostrar cada tamaño de subdirectorio en un formato de lista usando un comando de línea en Bash?