GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Betriebszeit im Bash-Format zur Anzeige von Tagen, Stunden und Minuten

Ich habe ein universelles Shell-Skript für Systeme erstellt, die uptime -p unterstützen wie neueres Linux und für diejenigen, die dies nicht tun, wie 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"

Kern

Referenzierte John1024-Antwort mit meinen eigenen Anpassungen.


Mein uptime erzeugt eine Ausgabe, die wie folgt aussieht:

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

So konvertieren Sie das in Ihr Format:

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

Wie es funktioniert

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

    awk teilt seine Eingabe in Felder auf. Dies weist awk an, eine beliebige Kombination aus Leerzeichen, Komma oder Doppelpunkt als Feldtrennzeichen zu verwenden.

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

    Dies weist awk an, das sechste Feld und das siebte Feld (getrennt durch ein Leerzeichen) gefolgt von einem Komma, das achte Feld, die Zeichenfolge hours, auszugeben das neunte Feld und zuletzt die Zeichenfolge minutes. .

Handhabung von Computern mit kurzen Betriebszeiten mit sed

Ab einem Neustart ist mein uptime erzeugt eine Ausgabe wie:

 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

Das folgende sed Befehl verarbeitet diese Formate:

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

Mit den oben genannten Zeiten ergibt dies:

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

Wie es funktioniert

  • -E aktiviert die erweiterte reguläre Ausdruckssyntax. (Verwenden Sie auf älteren GNU-Seds -r anstelle von -E )

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

    Dieser Ersetzungsbefehl entfernt den gesamten Text bis up .

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

    Dieser Ersatzbefehl entfernt die Benutzerzählung und den gesamten darauffolgenden Text.

  • s/min/minutes/

    Dies ersetzt min mit minutes .

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

    Enthält die Zeile eine Uhrzeit im Format hh:mm, trennt diese die Stunden von den Minuten und ersetzt sie durch hh hours, mm minutes .

Handhabung von Computern mit kurzen Betriebszeiten mit 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."}'

Bei denselben Testfällen wie oben ergibt dies:

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.

Für diejenigen, die awk-Code bevorzugen, der über mehrere Zeilen verteilt ist:

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

Lösung :Um die Linux-Betriebszeit in Sekunden zu erhalten, gehen Sie zu bash und geben Sie cat /proc/uptime ein .Parsen Sie die erste Zahl und konvertieren Sie sie gemäß Ihren Anforderungen.

Aus der RedHat-Dokumentation:

Diese Datei enthält Informationen darüber, wie lange das System seit dem letzten Neustart eingeschaltet war . Die Ausgabe von /proc/uptime ist ganz minimal:

350735.47 234388.90

Der Erste Zahl ist die Gesamtzahl der Sekunden, die das System in Betrieb war.

Die Zweite Zahl gibt an, wie viel dieser Zeit die Maschine in Sekunden im Leerlauf verbracht hat.


Nur der Vollständigkeit halber... was ist mit:

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

Linux
  1. So verwenden Sie den Uptime-Befehl in Ubuntu Linux

  2. Bash + Verwenden von Printf, um in einem speziellen Format zu drucken?

  3. Bash \xc3\x89 in É konvertieren?

  4. Blockieren Sie den Zugriff auf die Website an bestimmten Tagen und zu bestimmten Zeiten

  5. Wie man Cron alle 5 Minuten, Sekunden, Stunden, Tage, Monate ausführt

Bash-Exportvariable

Bash printf - So drucken Sie eine Variable in Bash

Bash Shebang

Bash-Skripting:So geben Sie Text in der Linux-Shell aus und formatieren ihn

Gibt es eine Möglichkeit, Benachrichtigungen vom Bash-Skript in Ubuntu anzuzeigen?

Jede Unterverzeichnisgröße in einem Listenformat mit einem Zeilenbefehl in Bash anzeigen?