Wie kann ich unnötigen Text aus einer Befehlszeilenausgabe entfernen?

487
D4rKP01s0n

Ich verwende GeekTool, das die Ausgabe von Terminalbefehlen in Desktop-Widgets umwandelt und den aktuellen Batterieprozentsatz meiner Bluetooth-Tastatur auf dem Desktop in Form von anzeigen wollte

Tastaturbatterie: (Prozentwert der Batterie)

Um dies zu erreichen, verwende ich den Befehl

ioreg -c AppleBluetoothHIDKeyboard |grep '"BatteryPercent" =' 

Welches ist von dieser Website.

Wie auf dieser Website erwähnt, gibt dieser Befehl jedoch diesen nicht sehr sauber aussehenden Text aus (ja, ich muss meine Batterien wechseln):

| | | | "BatteryPercent" = 17 

(Für diese Eingabe möchte ich also die Ausgabe Keyboard Battery: 17.) Daher frage ich mich, wie ich diese über die Befehlszeile in mein vorgesehenes Format von "Tastaturbatterie: (Prozentwert der Batterie) " konvertieren kann .

BEARBEITEN: Ich habe einen anderen Weg gefunden, um die Batterieprozente anzuzeigen, mit Ubersicht anstelle von GeekTool. Vielen Dank für Ihre Hilfe

2
Wollen Sie `Keyboard Battery: 17` oder` Keyboard Battery: (17) `? Dh möchten Sie wörtliche Klammern in der Ausgabe? G-Man vor 7 Jahren 0
Tastaturbatterie: 17 D4rKP01s0n vor 7 Jahren 0
Bitte erläutern Sie Ihre Frage nicht in Kommentaren. Bearbeiten Sie Ihre Frage, um sie klarer und vollständiger zu machen. Einige von uns haben sich bemüht, Ihre Frage zu beantworten. Wenn Sie keine Antwort mehr wünschen, sagen Sie es und gehen Sie weg, und wir lassen Sie in Ruhe. Wenn Sie jedoch eine Lösung wünschen, kopieren Sie unsere Antworten *** in Ihre Frage *** und zeigen Sie die Ausgabe, die Sie *** in Ihrer Frage *** erhalten. Verwenden Sie Copy & Paste aus unseren Antworten zu Ihrem Terminal und von Ihrem Terminal zu Ihrer Frage. G-Man vor 7 Jahren 0

3 Antworten auf die Frage

1
jehad

Um nur die Nummer zu erhalten, ändern Sie das " grep" in Ihrem Beispiel in Folgendes:

grep -oE '[0-9]+' 

Dies sollte funktionieren (zumindest die grep-Syntax wird sicherlich unter Linux funktionieren), aber ich habe keinen Mac, daher müssen Sie ihn möglicherweise ein wenig anpassen, um ihn zum Laufen zu bringen.

Erläuterung:

  • Das obige grep extrahiert nur den Zahlenteil der Ausgabe.
  • Bei der Option "o" wird NUR das Spiel angezeigt.
  • Die Option 'E' besagt, dass für den Abgleich ein regulärer Ausdruck verwendet wird.
  • '[0-9] +' ist der reguläre Ausdruck, um Zahlen zu finden (+ bedeutet eine oder mehrere).

Daher findet dieser grep-Befehl nur den Nummernteil der Ausgabezeichenfolge.

..

BEARBEITET ... nach einer zweiten Lesung scheint es, als ob Sie die Nummer benötigen, die an das Ende von "Keyboard Battery:" angehängt ist. Hier ist eine Lösung mit sed:

ioreg -c AppleBluetoothHIDKeyboard | sed -r 's/.*=[[:space:]]*([[:digit:]]*).*/Keyboard Battery: \1/;' 

In diesem Fall ersetzen Sie die ursprüngliche Zeichenfolge durch eine, die mit "Keyboard Battery:" beginnt.

Ich hoffe, es funktioniert auf dem Mac!

Ok danke, ich werde es auf meinem Mac ausprobieren, wenn ich zurückkomme, und dies als Antwort markieren, wenn es funktioniert D4rKP01s0n vor 7 Jahren 0
Möglicherweise möchten Sie dies in `sed 's /.* \ ([0-9] [0-9] * \). * / Tastaturbatterie: \ 1 /'` ändern. G-Man vor 7 Jahren 0
@ G-Man, warum brauchst du zwei Ziffernklassen? Der gleiche Effekt kann mit dem Plusoperator (ein oder mehrere) erzielt werden. `[0-9] +`, oder Sie können ein noch kurzes `\ d +` verwenden. Nach meiner Erfahrung wird die ausführlichere Klasse [[: digit:]] `breiter unterstützt (wie ich sage, habe keinen Mac und wollte etwas lieber arbeiten). Der Grund für "[: digit:]] *" in meiner Antwort (anstelle von "[[: digit:]] +") ist, weil ich die mögliche Ausgabe von "ioreg" nicht kenne, also am besten eine Übereinstimmung als keine Übereinstimmung (keine Übereinstimmung würde nur die ursprüngliche Zeichenfolge zurückgeben). jehad vor 7 Jahren 0
@ jehad: Ich verwende * RE * * RE * \ *, weil meine Version von `sed`` + `nicht erkennt. Es erkennt auch `\ d` nicht. Ein Problem mit * RE * \ * besteht darin, dass es mit einer Nullzeichenfolge übereinstimmen kann. Ich verstehe nicht, warum Sie es vorziehen, kein Spiel zu bekommen. Wenn Ihr `[[: digit:]] *` mit einer Nullzeichenfolge übereinstimmt, ist Ihr `\ 1 'null, und Sie manipulieren die Eingabezeile (möglicherweise verwerfen Sie eine Nummer an anderer Stelle in der Zeile). Ich finde auch, dass `sed`` (`und`) `als Nicht-Sonderzeichen behandelt und` \ (`…` \) `benötigt, um einen Teilstring (→` \ 1`) einzufangen. … (Fortsetzung) G-Man vor 7 Jahren 0
(Fortsetzung)… Ihr Befehl ist insofern fehlerhaft, als (1) erwartet wird, dass die Zahl in der Eingabe von Anführungszeichen umgeben ist (ist dies nicht), (2) er Anführungszeichen in den Ersetzungsstring einfügt (nicht erwünscht) und (3) fügt `:` zweimal in den Ersetzungsstring * ein. Das `;` ist auch nicht erforderlich. G-Man vor 7 Jahren 0
@ G-Man Danke, dass Sie sich die Zeit genommen haben, um im Detail nachzusehen. Ich habe meine getestet und es funktioniert wie erwartet und wie ich es beschrieben habe, und meine Erfahrung mit sed widerspricht dem, was Sie mir sagen (ich würde Ihren Punkten nicht zustimmen, aber keine Notwendigkeit) ... hmm, das hier wird interessant; Es gibt Sachen, die ich hier lernen kann. Ich verwende derzeit sed (GNU sed) 4.2.2, was in Linux / Ubuntu 14.04 enthalten ist. Könnten Sie mir bitte sagen, welche Version von Sed Sie verwenden, würde ich es gerne ausprobieren? jehad vor 7 Jahren 0
@ G-Man, nochmals vielen Dank für die Überprüfung, Sie haben mich dazu gezwungen, einen zweiten Blick darauf zu werfen, und ich habe bemerkt, dass ich fälschlicherweise davon ausgegangen bin, dass die Nummer in doppelte Anführungszeichen gesetzt wurde und dass in der Ausgabe doppelte Anführungszeichen erforderlich waren. Also habe ich meine Lösung weiter bearbeitet. jehad vor 7 Jahren 0
@jehad: Das ist interessant. Mein `sed` (aufgerufen mit` --version`) *** sagt *** auch `sed (GNU sed) 4.2.2`. (Ich lasse es auf Cygwin laufen.) Ich frage mich, ob wir in unseren Umgebungen etwas Besonderes haben. G-Man vor 7 Jahren 0
Ich habe meine Lektion gelernt. "Ich muss alle Fragen, die Mac betreffen, gut in Ruhe lassen, wenn ich keinen Mac habe." :-) Auch wenn sich unsere Umgebungen unterscheiden, scheinen wir dem armen Originalposter mehr Ärger zu bereiten. jehad vor 7 Jahren 0
1
Buffalo Rabor

Pfeife nach awk ...

$ioreg -c AppleBluetoothHIDKeyboard |grep '"BatteryPercent" ='|awk '' "BatteryPercent" = 51 

oder

$ioreg -c AppleBluetoothHIDKeyboard |grep '"BatteryPercent" ='|awk '' Keyboard Battery: (51) 
0
G-Man

Bitte lesen und verstehen Sie diese Frage:

Gibt der ioreg -c AppleBluetoothHIDKeyboardBefehl nur diese eine Zeile aus oder gibt er auch andere Zeilen aus (die Zahlen enthalten)?


Da Sie die Ausgabe wünschen Keyboard Battery: 17, die keine der bisher geposteten Antworten liefert, können Sie dies tun

Bauen Sie auf Jehads Antwort :

Wenn der ioregBefehl nur die BatteryPercentZeile ausgibt, dann

echo "Tastaturakku: $ (ioreg -c AppleBluetoothHIDKeyboard | grep -oE '[0-9] +')"

Wenn jedoch, wie ich vermute, der ioreg -c AppleBluetoothHIDKeyboardBefehl neben der "BatteryPercent" =Zeile noch andere Zeilen (die Zahlen enthalten) ausgibt, gibt der obige Befehl auch viele andere Zeilen mit Nummern aus.

Wenn, wie Sie implizit bestätigt haben, der ioregBefehl andere Zeilen (die Zahlen enthalten) ausgibt, dann

echo "Keyboard Battery: $(ioreg -c AppleBluetoothHIDKeyboard | grep BatteryPercent | grep -oE '[0-9]+')" 

Die überarbeitete Antwort von jhad funktioniert möglicherweise, wenn der ioregBefehl nur die BatteryPercentZeile ausgibt, obwohl kleine Änderungen erforderlich sein können.

Bauen Sie auf die Antwort von Buffalo Rabor :

Die überarbeitete Antwort von Buffalo Rabor wird funktionieren, mit der Maßgabe, dass die Ausgabe explizite Klammern enthält. Aber es lässt sich vereinfachen - Sie müssen sich kaum in folgende Bereiche grepeinarbeiten awk:

ioreg -c AppleBluetoothHIDKeyboard | awk '/BatteryPercent/ ' 

PS

Ich habe auch keinen Mac, also kann ich nicht sicher sein, was für Sie funktioniert und was nicht.

echo "Tastaturakku: $ (ioreg -c AppleBluetoothHIDKeyboard | grep -oE '[0-9] +')" gibt viele andere Zeilen mit Zahlen aus, ebenso wie die zweiten und dritten Befehle, die Sie angegeben haben. Außerdem funktionieren die Antworten von Buffalo und Jehad nicht. Jehads Revision führt zu sed: 1: "s /.*" ([[: digit:]] *) ". * / ...": \ 1 nicht definiert In der zweiten Option von RE und Buffalo wurde, während die Ausgabe zuvor anders ausgegeben wurde, jetzt = '| awk' '"BatteryPercent" = 51 awk: Datei "BatteryPercent" kann nicht geöffnet werden D4rKP01s0n vor 7 Jahren 0
Wie ich und @ G-Man gewarnt haben, haben wir keinen Mac. Und wir können nur auf unserem GNU-Sed testen, was mit Sicherheit nicht dasselbe ist wie in Mac OS. Wenn Sie experimentieren, bin ich sicher, dass Sie eine Variation einer unserer Lösungen erhalten können. Beispielsweise könnte der Fehler "\ 1 nicht definiert" bedeuten, dass Sie vor den Klammern '\' verwenden müssen, sodass der Teil `([[: Ziffer:]] *)` zu `\ ([[Ziffer::]] wird. * \) `. jehad vor 7 Jahren 0
@ D4rKP01s0n: Es wäre ungewöhnlich, dass ein Befehl an einem Tag arbeitet und am nächsten Tag explosiv ausfällt, es sei denn, in der Zwischenzeit wurden katastrophale Änderungen am System vorgenommen. Es ist wahrscheinlicher, dass Sie einen Schreibfehler gemacht haben. Insbesondere wenn Sie eine Fehlermeldung erhalten, die mit `= '| awk' beginnt, haben Sie wahrscheinlich die Anführungszeichen falsch geschrieben. G-Man vor 7 Jahren 0