![So funktioniert dieser Awk-Befehl](https://rvso.com/image/76427/So%20funktioniert%20dieser%20Awk-Befehl.png)
Ich möchte, dass der folgende Befehl funktioniert, aber es gelingt mir nicht. Bitte sehen Sie sich das hier an:
echo "random string random string mark: abcde random string random string" |
awk '{gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"); print}'
Ich möchte, dass dieser Befehl nur „abcde“ zurückgibt. Aber er gibt immer die gesamte Eingabezeichenfolge zurück. Warum?
Antwort1
Der Befehl gensub verändert den String nicht. Das Ergebnis ist eine Ausgabe der Funktion.
Bitte versuche:
echo "random string random string mark: abcde random string random string" |
awk '{print(gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"))}'
Bearbeiten:
Es stellt sich heraus, dass der Benutzer die obere Ausgabe analysieren muss, was (wie vom Benutzer gewünscht) folgendermaßen geschieht:
top -b -n 1 -d 1 |
awk 'NR==1{print(gensub(/.*load average: ([0-9\.\, ]+).*$/,"\\1","gs"))}'
Hinweis: Für Gebietsschemas, die Kommas als Dezimaltrennzeichen verwenden, sind sowohl Punkte als auch Kommas zulässig.
Bitte schauen Sie sich mpstat anwie hier dargestellt, könnte es besser zu Ihren Anforderungen passen.
Antwort2
Um Ihre Frage anders zu formulieren: Sie möchten das erste Wort nach der Zeichenfolge „mark: “ drucken.
Unterwegs, in awk:
echo "random string random string mark: abcde random string random string" | \
awk -v RS="mark: " 'NR==2{print $1}'
Das Obige teilt die Zeichenfolge in zwei durch „mark: “ getrennte Datensätze auf und druckt dann das erste Wort des zweiten Datensatzes (das „abcde“ ist).
In sed:
echo "random string random string mark: abcde random string random string" | \
sed 's/.*mark: \([^ ]*\).*/\1/'
Im obigen Beispiel werden reguläre Ausdrücke verwendet, um das erste Wort ohne Leerzeichen nach der Markierung „mark:“ zu finden und die gesamte Zeichenfolge durch dieses Wort zu ersetzen.