Problem
Ich habe nach einer Lösung in Bash gesucht, die bestimmte Informationen nach einer bestimmten Zeichenfolge extrahieren kann.
Beispiel
Zum Beispiel (vom Laufen acpi
):
Battery 0: Discharging, 37%, 01:33:20 remaining
Wie kann ich den Prozentsatz nach der Entlassung extrahieren? In diesem Fall wäre es 37%
...
Anmerkungen
Ich suche nach einer einfachen Lösung, die keine Reihe von Befehlsargumenten erfordert.
command-line
text-processing
NerdOfCode
quelle
quelle
awk
Beispiel erklären könnten , wäre das großartig. Ich hatte vor, nur damit herumzuspielen, aber eine Erklärung wäre besser.{}
'{print$2}'
man awk
.Hier sind ein paar:
quelle
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 ingrep
mit-P
(Perl-Regex zulassen) und-o
(nur Übereinstimmung):Wo
string
ist ein Ausdruck, der mit dem übereinstimmt, was vor dem steht, was Sie wollen, und wodesired
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:[^,]+
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)
:wo
\1
ist was mit gerettet wurde(
)
. Für Ihr Beispiel:Hier ist eine Möglichkeit, dies nur mit Bash in Ihrem Beispiel zu tun
${var#string*}
schneidetvar
vorstring
(einschließlich) und${var%string*}
schneidetvar
nachstring
(einschließlich).Dies ist keine vollständige Liste. Es gibt viele Möglichkeiten, dies zu tun :)
quelle
(...)
) kann unangemessen sein, wenn der Prozentsatz unter 10 liegt. Oder 100.Eine Bash-Lösung, wie gewünscht, ohne unangenehme Awkismen oder sedulierende Sedismen:
Dies verwendet die Befehlssubstitution, erstellt ein Array der Befehlsausgabe und zeigt das 4. Element des Arrays an.
Dies funktioniert mit der Ausgabe von acpi, die anscheinend immer den Batterieprozentsatz als 4. Parameter hat. Wenn Sie das Element des Arrays nach "Entladen" suchen möchten, erhalten Sie kein Ergebnis, wenn acpi "Batterie 0: Voll, 100%" anzeigt.
quelle
Sie können auch die Teilstring-Extraktion mit Parametererweiterung verwenden
quelle