Ich habe nach einer Lösung in bash gesucht, die bestimmte Informationen nach einer bestimmten Zeichenfolge extrahieren kann.
Nach einer bestimmten Zeichenfolge? Keine der beiden zuvor veröffentlichten Antworten tut dies speziell (da das Abrufen von Text nach einer Zeichenfolge nicht der beste Weg ist, um die Informationen zu erhalten, die Sie in Ihrem Beispiel gewünscht haben).
Hier sind einige Möglichkeiten, um Text nach einer Zeichenfolge abzurufen. Ich habe Ihr Beispiel verwendet, obwohl Dessert Antwort und Antwort des terdon beide geeignetere Ansätze auf diesen speziellen Fall zu demonstrieren.
Verwendung \Kvon Perl, zum Beispiel in grepmit -P(Perl-Regex zulassen) und -o(nur Übereinstimmung):
grep -Po 'string\Kdesired'
Wo stringist ein Ausdruck, der mit dem übereinstimmt, was vor dem steht, was Sie wollen, und wo desiredein Ausdruck mit dem übereinstimmt, was Sie ausgeben möchten? Dies ist nützlich, wenn das gewünschte Muster an einer anderen Stelle in der Datei / Zeile vorkommt (z. B. ist es eine Zahl und die Datei / Zeile enthält andere Zahlen). In Ihrem Beispiel könnte dies etwa so aussehen:
$ acpi | grep -Po 'ing, \K[^,]+'
79%
[^,]+bedeutet einige Zeichen, die kein Komma sind, so dass Text bis zu einem Komma erfasst werden kann. Wir könnten auch ...drei beliebige Zeichen verwenden, aber wie in einem Kommentar von PerlDuck ausgeführt , ist es möglich, dass das gewünschte Muster hier mehr oder weniger als drei Zeichen enthält.
In sedkönnen Sie Erfassungsgruppen mit (und verwenden ):
sed -r 's/.*string(desired).*/\1/'
wo \1ist was mit gerettet wurde ( ). Für Ihr Beispiel:
$ acpi | sed -r 's/.*ing, ([^,]+).*/\1/'
89%
Hier ist eine Möglichkeit, dies nur mit Bash in Ihrem Beispiel zu tun
$ output=$(acpi); string="${output#*ing, *}"; desired="${string%,*}"; echo "$desired"
96%
${var#string*}schneidet varvor string(einschließlich) und ${var%string*}schneidet varnach string(einschließlich).
Dies ist keine vollständige Liste. Es gibt viele Möglichkeiten, dies zu tun :)
awkBeispiel erklären könnten , wäre das großartig. Ich hatte vor, nur damit herumzuspielen, aber eine Erklärung wäre besser.