Analysieren Sie `uptime` nur für die Dauer

Analysieren Sie `uptime` nur für die Dauer

Wenn ich den Befehl „uptime“ auf meinem Mac ausführe, erhalte ich diese Ausgabe:

19:52  up 14 mins, 2 users, load averages: 2.95 4.19 4.31

Dies ändert sich leicht, je nachdem, wie lange das System aktiv ist, und fügt Stunden und dann Tage hinzu. Daher möchte ich das erste Wort plus Leerzeichen und 4 Zeichen vor „Benutzer“ entfernen.

Herstellung19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31

Das:

up 14 min

Oder

8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40

Das:

up 52 days, 20:47

Oder:

22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27

Das:

up 54 days, 1 min

Bisher komme ich mit Folgendem am weitesten:, uptime | cut -d " " -f2- | sed 's/users.*//'aber das gibt mir immer noch ein Leerzeichen vor „up“ und ich muss immer noch 4 Zeichen am Ende der Zeichenfolge entfernen. Kann mich jemand aufklären?

Antwort1

Ich verwende Folgendes (passen Sie es bei Bedarf an, um Einheiten einzuschließen):

#!/usr/bin/awk -f

    BEGIN {
      while ("uptime" | getline)
        gsub(/,/,"")
        if (NF==10)
          print $3
        else if (NF==11)
          print $3,$4
        else if (NF==12)
          print $3,$4,$5
        else
          print $3,$4,$5,$6
      close("uptime")
    }

Antwort2

Versuchen:

sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/'

Beispiele

Dies sind die Beispiele aus der Frage:

$ cat upfile
19:52  up 14 mins, 2 users, load averages: 2.95 4.19 4.31
8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40
22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27

Der sed-Befehl erzeugt:

$ sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min

Wie es funktioniert

Wir verwenden einen Ersatzbefehl:

s/.*(up.*), [[:digit:]]+ user.*/\1/
  • Die ersten .*Übereinstimmungen vom Anfang der Zeile.

  • (up.*)Ordnet das Wort dem darauffolgenden Text zu und speichert es in Gruppe 1.

  • , [[:digit:]]+ usersentspricht einem Komma, gefolgt von einem Leerzeichen, gefolgt von einer oder mehreren Ziffern, gefolgt von einem Leerzeichen, gefolgt von der Zeichenfolge users.

  • Der zweite Wert .*stimmt mit allem nach überein user.

Wir ersetzen das alles durch Gruppe 1, bezeichnet mit \1.

Kompatibilität

Das Obige sollte sowohl unter BSD/OSX als auch unter modernem Linux funktionieren. Unter sehr altem Linux muss man es möglicherweise -Edurch Folgendes ersetzen -r:

sed -r 's/.*(up.*), [[:digit:]]+ user.*/\1/'

Perl-Version

$ perl -pe 's/.*(up.*), [[:digit:]]+ user.*/$1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min

verwandte Informationen