Jak mogę usunąć niepotrzebny tekst z wyjścia wiersza poleceń?

2

Korzystam z GeekTool, który pobiera dane wyjściowe poleceń terminala i zamienia je w widżety pulpitu, i chciałem wyświetlić aktualny procent baterii mojej klawiatury bluetooth na pulpicie w postaci

Bateria klawiatury: (procentowa wartość baterii)

Aby to osiągnąć, używam polecenia

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

który jest z tej strony.

Jednak, jak wspomniano na tej stronie, to polecenie wyświetla ten niezbyt czysty tekst (tak, muszę wymienić baterie):

| |   |   |   "BatteryPercent" = 17

(Więc dla tego wejścia chcę wynik Keyboard Battery: 17.) Dlatego moje pytanie brzmi: w jaki sposób przekonwertować to na zamierzony format „Bateria klawiatury: (Wartość procentowa baterii) ” za pomocą wiersza polecenia?

EDYCJA: Znalazłem inny sposób, aby pokazać procent baterii, używając Ubersicht zamiast GeekTool, dziękuję wszystkim za pomoc

D4rKP01s0n
źródło
Więc chcesz Keyboard Battery: 17czy Keyboard Battery: (17)? Tj. Czy chcesz dosłowne nawiasy wyjściowe?
G-Man,
Bateria klawiatury: 17
D4rKP01s0n
Nie wyjaśniaj swojego pytania w komentarzach; edytuj swoje pytanie, aby było jaśniejsze i bardziej kompletne. Kilku z nas włożyło trochę wysiłku w odpowiedź na twoje pytanie. Jeśli nie chcesz już odpowiedzi, powiedz to i odejdź, a my zostawimy cię w spokoju. Ale jeśli potrzebujesz rozwiązania, skopiuj nasze odpowiedzi do swojego pytania i pokaż wyniki, które otrzymałeś w swoim pytaniu . Skorzystaj z funkcji kopiuj i wklej z naszych odpowiedzi do swojego Terminala oraz z Terminala do pytania.
G-Man,

Odpowiedzi:

0

Proszę przeczytać, zrozumieć i potwierdzić to pytanie:

Czy ioreg -c AppleBluetoothHIDKeyboardpolecenie wypisuje tylko ten jeden wiersz, czy też wypisuje również inne wiersze (zawierające liczby)?


Ponieważ chcesz uzyskać wynik Keyboard Battery: 17, którego nie da żadna z dotychczas opublikowanych odpowiedzi, możesz

Oprzyj się na odpowiedzi jehada :

Jeśli ioregpolecenie wyświetla tylko BatteryPercentlinię, to

echo „Bateria klawiatury: $ (ioreg -c AppleBluetoothHIDKeyboard | grep -oE '[0-9] +')”

Ale jeśli, jak podejrzewam, ioreg -c AppleBluetoothHIDKeyboardpolecenie wypisuje inne wiersze (zawierające liczby), oprócz "BatteryPercent" =wiersza, wówczas powyższe polecenie wypisze również wiele innych wierszy z liczbami.

Jeśli, jak masz pośrednio potwierdził, że ioregwyjścia polecenia inne linie (które zawierają numery), a następnie

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

Poprawiona odpowiedź jehada może działać, jeśli ioregpolecenie wypisuje tylko BatteryPercentwiersz, chociaż może wymagać niewielkich zmian.

Budowanie na odpowiedź Buffalo Rabor za :

Poprawiona odpowiedź Buffalo Rabora będzie działać, pod warunkiem, że zawiera ona jawne nawiasy wyjściowe. Ale można to uprościć - prawie nigdy nie trzeba podłączać grepdo awk:

ioreg -c AppleBluetoothHIDKeyboard | awk '/BatteryPercent/ {print "Keyboard Battery: "$7}'

PS

Nie mam też komputera Mac, więc nie mogę mieć pewności, co będzie dla ciebie działać, a co nie.

G-Man
źródło
echo „Bateria klawiatury: $ (ioreg -c AppleBluetoothHIDKeyboard | grep -oE '[0-9] +')” generuje wiele innych wierszy z liczbami, podobnie jak podane przez ciebie drugie i trzecie polecenie. Ponadto, zarówno odpowiedzi Buffalo, jak i jehada nie działają, a wersja jehada skutkuje sed: 1: „s /.*” ([[: cyfra:]] *) „. * / ...”: \ 1 nie zdefiniowano w drugiej opcji RE i Buffalo, chociaż wcześniej wypisywał inaczej, teraz wypisuje = '| awk' {print 5, 6 $, 7 $} '„BatteryPercent” = 51 awk: nie można otworzyć pliku Numer linii źródłowej BatteryPercent 1
D4rKP01s0n
Jak ostrzegałem ja i @ G-Man, nie mamy komputera Mac. I możemy testować tylko na naszym GNU sed, co prawie na pewno nie jest takie samo jak w Mac OS. Jeśli eksperymentujesz, jestem pewien, że możesz uzyskać odmianę jednego z naszych rozwiązań. Na przykład błąd „\ 1 nie zdefiniowano” może oznaczać, że trzeba użyć „\” przed nawiasami, aby część ([[:digit:]]*)stała się \([[:digit:]]*\).
jead
@ D4rKP01s0n: Polecenie zadziała jeden dzień i wybuchnie następnego dnia, chyba że w międzyczasie zostaną wprowadzone w systemie katastroficzne zmiany. Bardziej prawdopodobne jest, że popełniłeś błąd podczas pisania. W szczególności, jeśli pojawia się komunikat o błędzie, który zaczyna się od ='|awk, prawdopodobnie źle wpisałeś cytaty.
G-Man,
1

Aby uzyskać tylko numer, zmień „ grep” w swoim przykładzie na:

grep -oE '[0-9]+'

To powinno zadziałać (przynajmniej składnia grep z pewnością zadziała na Linuksie), ale nie mam komputera Mac, więc może być konieczne jego nieco zmodyfikowanie, aby działało.

Wyjaśnienie:

  • Powyższy grep wyodrębnia tylko część liczbową wyniku.
  • Opcja „o” mówi pokaż tylko dopasowanie.
  • Opcja „E” mówi do dopasowania wyrażenia regularnego.
  • „[0–9] +” jest wyrażeniem regularnym służącym do znajdowania liczb (+ oznacza jeden lub więcej).

Dlatego to polecenie grep znajdzie tylko część liczbową ciągu wyjściowego.

..

EDYTOWANE ... po drugim czytaniu wygląda na to, że potrzebujesz numeru dołączonego na końcu „Baterii klawiatury:”, więc oto rozwiązanie wykorzystujące sed:

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

W takim przypadku zamieniasz oryginalny ciąg znaków na taki, który zaczyna się od „Bateria klawiatury:”.

Znowu mam nadzieję, że działa na Macu!

święta wojna
źródło
Ok dzięki, wypróbuję to na moim Macu, kiedy wrócę do niego i
zaznaczę
Możesz to zmienić na sed 's/.* \([0-9][0-9]*\).*/Keyboard Battery: \1/'.
G-Man
@ G-Man, dlaczego potrzebujesz dwóch klas cyfr? Ten sam efekt można uzyskać z operatorem plusa (jednego lub więcej); [0-9]+lub możesz użyć jeszcze krótszej ręki \d+. Z mojego doświadczenia [[:digit:]]wynika, że ​​bardziej wszechstronna klasa jest szeroko wspierana (tak jak mówię, nie mam komputera Mac, więc chciałem czegoś bardziej prawdopodobnego). Powodem [[:digit:]]*mojej odpowiedzi (zamiast [[:digit:]]+) jest to, że nie znam możliwego wyniku ioreg, więc najlepiej mieć dopasowanie niż brak dopasowania (brak dopasowania zwróci tylko oryginalny ciąg).
jead
@jehad: Używam  RE RE  *, ponieważ moja wersja sednie rozpoznaje +. Ponadto nie rozpoznaje \d. Problem z  RE  * polega na tym, że może on pasować do łańcucha zerowego. Nie rozumiem, dlaczego wolisz, aby nie dorównać; jeśli twoja [[:digit:]]*wartość \1jest pusta, oznacza to, że twoja wartość jest pusta i zmieniasz linię wejściową (prawdopodobnie odrzucasz liczbę gdzie indziej w linii). Uważam też, że sedtraktuje to (i )jako znaki inne niż specjalne, i potrzebuje \(\)uchwycenia podłańcucha (→  \1). … (Ciąg dalszy)
G-Man,
(Ciąg dalszy)… Twoje polecenie jest wadliwe w tym, że (1) oczekuje, że liczba na wejściu zostanie otoczona cudzysłowami (nie jest), (2) wstawia cudzysłowy do ciągu zastępującego (nie jest pożądany) i (3) wstawia :  się dwukrotnie w łańcuch zastępczy . Jest to również ;niepotrzebne.
G-Man,
1

rura do awk ...

$ioreg -c AppleBluetoothHIDKeyboard |grep '"BatteryPercent" ='|awk '{print $5, $6, $7}'
"BatteryPercent" = 51

lub

$ioreg -c AppleBluetoothHIDKeyboard |grep '"BatteryPercent" ='|awk '{print "Keyboard Battery: ("$7")"}'
Keyboard Battery: (51)
Buffalo Rabor
źródło