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 \K
von Perl, zum Beispiel in grep
mit -P
(Perl-Regex zulassen) und -o
(nur Übereinstimmung):
grep -Po 'string\Kdesired'
Wo string
ist ein Ausdruck, der mit dem übereinstimmt, was vor dem steht, was Sie wollen, und wo desired
ein 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 sed
können Sie Erfassungsgruppen mit (
und verwenden )
:
sed -r 's/.*string(desired).*/\1/'
wo \1
ist 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 var
vor string
(einschließlich) und ${var%string*}
schneidet var
nach string
(einschließlich).
Dies ist keine vollständige Liste. Es gibt viele Möglichkeiten, dies zu tun :)
awk
Beispiel erklären könnten , wäre das großartig. Ich hatte vor, nur damit herumzuspielen, aber eine Erklärung wäre besser.