
Die Ausgabe w | head -1
kann für meine Maschine zwei verschiedene Ergebnisse liefern:
16:34:42 up 32 days, 3:02, 1 user, load average: 0.14, 0.11, 0.07
14:10:55 up 32 days, 39 min, 1 user, load average: 0.07, 0.13, 0.09
Ich muss Zahlen zur durchschnittlichen Auslastung abrufen (z. B. 0.07, 0.13, 0.09
). Wie kann ich die Zeile nach load average:
Zeichenfolge aufteilen, sodass ich immer die Zahlen zur durchschnittlichen Auslastung für zwei Fälle abrufen kann?
Antwort1
Sie können auch awk verwenden:
$ w | head -1 | awk '{print $10,$11,$12}'
0.80, 0.84, 0.93
Oder verwenden Sie:
$ w | head -1 | awk '{print $(NF-2),$(NF-1),$NF}'
0.81, 0.82, 0.91
Oder die viel elegantere (danke @Letitzia):
$ w | head -1 | awk -F "load average: " '{print $2}'
Sed:
$ w | head -1 | sed 's/.*load average: *//'
Perl:
$ w | head -1 | perl -pe 's/.*load average: *//'
oder
$ w | head -1 | perl -lne '/.*load average: *(.*)/ && print $1'
Sie können hier tatsächlich verwenden colrm
, beachten Sie jedoch, dass dadurch „Spalten“ entfernt werden, die als „ein einzelnes Zeichen in einer Zeile“ definiert sind. Dies funktioniert zwar für das von Ihnen angegebene Beispiel (aufgrund des zusätzlichen Platzes), aber nicht, wenn sich die Anzahl der Spalten weiter ändert. Hier werden die Spalten 1 bis 51 gelöscht.
$ w | head -1 | colrm 1 51
Antwort2
Normalerweise verwende ich einfach die${parameter#word}
Bash-Parametererweiterung. Es erweitert $parameter
und löscht word
(was ein Muster sein kann) von Anfang an.
In Ihrem Fall so etwas wie:
line=...
echo ${line#*load average: }
Eine Funktion daraus machen:
get_load() {
w | head -n 1 | { read -r line; echo ${line#*load average: }; }
}
Antwort3
Wenn Sie nur die letzten Zahlen möchten, können Sie grep verwenden:
$ w | grep -Po 'load average: \K.*'
0.07, 0.13, 0.09
Antwort4
Ein anderer perl
:
$ w | head -1 | perl -nle 'print +(split /load average:/)[-1]'
0.42, 0.49, 0.63