GNU/Linux >> Znalost Linux >  >> Linux

Doba provozuschopnosti formátu Bash pro zobrazení dnů, hodin, minut

Vytvořil jsem univerzální shell skript pro systémy, které podporují uptime -p jako novější linux a pro ty, kteří ne, jako 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"

Podstata

Odkazovaná odpověď John1024 s mými vlastními úpravami.


Můj uptime vytváří výstup, který vypadá takto:

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

Chcete-li to převést do vašeho formátu:

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

Jak to funguje

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

    awk rozdělí svůj vstup do polí. To awk říká, že má jako oddělovač polí použít libovolnou kombinaci jedné nebo více mezer, čárky nebo dvojtečky.

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

    To říká awk, aby vytiskl šesté pole a sedmé pole (oddělené mezerou) následované čárkou, 8. polem, řetězcem hours, deváté pole a nakonec řetězec minutes. .

Ovládání počítačů s krátkou dobou provozu pomocí sed

Po restartu, můj uptime vytváří výstup jako:

 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

Následující sed příkaz zpracovává tyto formáty:

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

S výše uvedenými časy to produkuje:

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

Jak to funguje

  • -E zapne rozšířenou syntaxi regulárního výrazu. (U starších GNU sedů použijte -r místo -E )

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

    Tento příkaz nahrazuje veškerý text až do up .

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

    Tento náhradní příkaz odstraní počet uživatelů a veškerý text, který za ním následuje.

  • s/min/minutes/

    Nahrazuje min s minutes .

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

    Pokud řádek obsahuje čas ve formátu hh:mm, oddělí se tím hodiny od minut a nahradí se hh hours, mm minutes .

Ovládání počítačů s krátkou dobou provozu pomocí 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."}'

Ve stejných testovacích případech jako výše to produkuje:

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.

Pro ty, kteří preferují awk kód rozložený na více řádcích:

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

Řešení :Chcete-li získat dostupnost linuxu během několika sekund, přejděte na bash a zadejte cat /proc/uptime .Analyzujte první číslo a převeďte jej podle svých požadavků.

Z dokumentace RedHat:

Tento soubor obsahuje informace o tom, jak dlouho byl systém zapnutý od posledního restartu . Výstup /proc/uptime je zcela minimální:

350735.47 234388.90

První číslo je celkový počet sekund, po které byl systém v provozu.

Druhé číslo je, kolik z tohoto času strávil stroj nečinný, v sekundách.


Jen pro úplnost... o co jde:

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

Linux
  1. Jak používat příkaz Uptime v Ubuntu Linux

  2. Bash + Použití Printf za účelem tisku ve speciálním formátu?

  3. Bash Převést \xc3\x89 na É?

  1. Blokovat přístup na stránky v určité dny a hodiny

  2. Jak spouštět Cron každých 5 minut, sekund, hodin, dnů, měsíců

  3. Jednoduchý způsob, jak převést HH:MM:SS (hodiny:minuty:sekundy.rozdělené sekundy) na sekundy

  1. Jak porovnat dva řetězce ve formátu verze oddělené tečkami v Bash?

  2. odečíst dny od data v bash

  3. Získejte aktuální čas v hodinách a minutách