
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:]]+ users
entspricht einem Komma, gefolgt von einem Leerzeichen, gefolgt von einer oder mehreren Ziffern, gefolgt von einem Leerzeichen, gefolgt von der Zeichenfolgeusers
.Der zweite Wert
.*
stimmt mit allem nach übereinuser
.
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 -E
durch 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