GNU/Linux >> Linux Esercitazione >  >> Linux

Bash formatta il tempo di attività per mostrare giorni, ore, minuti

Ho creato uno script di shell universale, per sistemi che supportano uptime -p come Linux più recente e per quelli che non lo fanno, come 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"

Essenziale

Risposta John1024 referenziata con le mie personalizzazioni.


Il mio uptime produce un output simile a:

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

Per convertirlo nel tuo formato:

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

Come funziona

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

    awk divide il suo input in campi. Questo dice ad awk di usare qualsiasi combinazione di uno o più spazi, virgola o due punti come separatore di campo.

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

    Questo dice ad awk di stampare il sesto campo e il settimo campo (separati da uno spazio) seguiti da una virgola, l'ottavo campo, la stringa hours, il nono campo e, infine, la stringa minutes. .

Gestione di computer con tempi di attività brevi utilizzando sed

A partire da un riavvio, il mio uptime produce un output come:

 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

Il seguente sed comando gestisce questi formati:

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

Con i tempi di cui sopra, questo 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

Come funziona

  • -E attiva la sintassi estesa delle espressioni regolari. (Su vecchi GNU seds, usa -r al posto di -E )

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

    Questo comando di sostituzione rimuove tutto il testo fino a up .

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

    Questo comando sostitutivo rimuove il conteggio degli utenti e tutto il testo che lo segue.

  • s/min/minutes/

    Questo sostituisce min con minutes .

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

    Se la riga contiene un orario nel formato hh:mm, questo separa le ore dai minuti e lo sostituisce con hh hours, mm minutes .

Gestione di computer con tempi di attività brevi utilizzando 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."}'

Negli stessi casi di test di cui sopra, questo 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.

Per coloro che preferiscono il codice awk distribuito su più righe:

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."
    }'

Soluzione :Per ottenere il tempo di attività di Linux in pochi secondi, vai su bash e digita cat /proc/uptime .Analizza il primo numero e convertilo in base alle tue esigenze.

Dalla documentazione di RedHat:

Questo file contiene informazioni dettagliate per quanto tempo il sistema è stato acceso dall'ultimo riavvio . L'output di /proc/uptime è abbastanza minimale:

350735.47 234388.90

Il Primo numero è il numero totale di secondi in cui il sistema è stato attivo.

Il Secondo number è quanto di quel tempo la macchina ha trascorso inattiva, in secondi.


Solo per completezza... di cosa si tratta:

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

Linux
  1. Come utilizzare il comando Uptime in Ubuntu Linux

  2. Bash + Utilizzo di Printf per stampare in un formato speciale?

  3. Come eseguire Cron ogni 5 minuti, secondi, ore, giorni, mesi

  4. Come confrontare due stringhe nel formato della versione separata da punti in Bash?

  5. Esegui il comando bash sulla pipeline jenkins

Variabile di esportazione Bash

Bash printf - Come stampare una variabile in Bash

Bash Shebang

Bash Scripting:come generare e formattare il testo su Linux Shell

C'è un modo per mostrare la notifica dallo script bash in Ubuntu?

Mostra solo il nome della directory corrente (non il percorso completo) al prompt di bash