Как я могу удалить ненужный текст из командной строки?

386
D4rKP01s0n

Я использую GeekTool, который принимает выходные команды терминала и превращает их в виджеты рабочего стола, и хотел отобразить текущий процент заряда батареи моей bluetooth-клавиатуры на рабочем столе в виде

Батарея клавиатуры: (значение процента батареи)

Для этого я использую команду

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

который с этого сайта.

Однако, как упоминалось на этом веб-сайте, эта команда выводит этот не очень чистый на вид текст (да, мне нужно поменять батарейки):

| | | | "BatteryPercent" = 17 

(Итак, для этого ввода я хочу вывод Keyboard Battery: 17.) Поэтому мой вопрос заключается в том, как мне преобразовать это в мой предполагаемый формат «Батарея клавиатуры: (значение процента от батареи) » через командную строку?

РЕДАКТИРОВАТЬ: я нашел другой способ показать процент батареи, используя Ubersicht вместо GeekTool, спасибо всем за вашу помощь

2
Итак, хотите ли вы `Keyboard Battery: 17` или` Keyboard Battery: (17) `? Т.е. вы хотите буквальные скобки в выводе? G-Man 7 лет назад 0
Батарея клавиатуры: 17 D4rKP01s0n 7 лет назад 0
Пожалуйста, не уточняйте свой вопрос в комментариях; [отредактируйте] ваш вопрос, чтобы сделать его более понятным и полным. Некоторые из нас приложили некоторые усилия, чтобы ответить на ваш вопрос. Если вам больше не нужен ответ, скажите об этом и уходите, и мы оставим вас в покое. Но если вам нужно решение, скопируйте наши ответы *** в свой вопрос *** и покажите результат, который вы получите *** в своем вопросе ***. Используйте copy & paste из наших ответов на ваш Терминал и с вашего Терминала на ваш вопрос. G-Man 7 лет назад 0

3 ответа на вопрос

1
jehad

Чтобы получить только номер, измените " grep" в вашем примере на следующее:

grep -oE '[0-9]+' 

Это должно работать (по крайней мере, синтаксис grep, безусловно, будет работать в Linux), но у меня нет Mac, поэтому, возможно, вам придется немного его настроить, чтобы заставить его работать.

Объяснение:

  • Приведенный выше grep извлекает только числовую часть выходных данных.
  • Опция 'o' гласит: показывать ТОЛЬКО совпадение.
  • Опция «E» говорит использовать регулярное выражение для сопоставления.
  • '[0-9] +' - это регулярное выражение для поиска чисел (+ означает одно или несколько).

Следовательно, эта команда grep найдет только числовую часть выходной строки.

..

EDITED ... после второго чтения кажется, что вам нужно число, добавленное в конце "Battery Keyboard:", так что вот решение с использованием sed:

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

В этом случае вы заменяете исходную строку строкой, начинающейся с «Аккумулятор клавиатуры:».

Опять же, надеюсь, что это работает на Mac!

Хорошо, спасибо, я опробую это на своем Mac, когда вернусь к нему и помечу это как ответ, если это сработает D4rKP01s0n 7 лет назад 0
Вы можете изменить это значение на `sed 's /.* \ ([0-9] [0-9] * \). * / Батарея клавиатуры: \ 1 /'`. G-Man 7 лет назад 0
@ G-Man зачем тебе два класса цифр? Тот же эффект можно получить с помощью оператора плюс (один или несколько); `[0-9] +`, или вы можете использовать еще более короткую комбинацию `\ d +`. По моему опыту, более подробный класс `[[: digit:]]` более широко поддерживается (как я уже сказал, у меня нет Mac, поэтому хотелось, чтобы что-то работало с большей вероятностью). Причина `[[: digit:]] *` в моем ответе (вместо `[[: digit:]] +`) заключается в том, что я не знаю возможного вывода `ioreg`, поэтому лучше всего иметь match, чем no match (никакое совпадение не вернет только исходную строку). jehad 7 лет назад 0
@jehad: я использую * RE * * RE * \ *, потому что моя версия `sed` не распознает` + `. Кроме того, он не распознает `\ d`. Проблема с * RE * \ * заключается в том, что он может соответствовать пустой строке. Я не понимаю, почему ты предпочитаешь это, чтобы не совпадать; если ваш `[[: digit:]] *` соответствует пустой строке, тогда ваш `\ 1` равен нулю, и вы искажаете строку ввода (возможно, отбрасывая число где-то еще в строке). Также я считаю, что `sed` обрабатывает` (`и`) `как не специальные символы и нуждается в` \ (`…` \) `для захвата подстроки (→` \ 1`). … (Продолжение) G-Man 7 лет назад 0
(Продолжение)… Ваша команда имеет недостатки в том, что (1) она ожидает, что число на входе будет заключено в кавычки (это не так), (2) она вставляет кавычки в строку замены (не желательно), и (3) он вставляет `:` в строку замены * дважды *. Кроме того, `;` не требуется. G-Man 7 лет назад 0
@ G-Man Спасибо, что нашли время, чтобы проверить в деталях. Я проверил мой, и он работает, как я ожидаю и как я описал, и мой опыт sed противоречит тому, что вы говорите мне (я не согласен с вашими точками, но не нужно) ... хм, это становится интересным; Есть вещи, которые я могу изучить здесь. В настоящее время я использую sed (GNU sed) 4.2.2, которая поставляется в комплекте с Linux / Ubuntu 14.04. Не могли бы вы сказать мне, какую версию sed вы используете, я хотел бы попробовать ее? jehad 7 лет назад 0
@ G-Man, еще раз спасибо за проверку, ты заставил меня взглянуть еще раз, и я заметил, что неправильно предположил, что число заключено в двойные кавычки, и что на выходе требовалось двойные кавычки. Итак, я отредактировал свое решение дальше. jehad 7 лет назад 0
@jehad: это интересно. Мой `sed` (вызывается с` --version`) *** также *** говорит `sed (GNU sed) 4.2.2`. (Я запускаю его на Cygwin.) Интересно, есть ли у нас что-то значительное в нашей среде? G-Man 7 лет назад 0
Я усвоил свой урок. «Я должен оставить в покое любые вопросы, касающиеся Mac, когда у меня нет Mac». :-) Несмотря на то, что наше окружение отличается, мы, кажется, создаем больше проблем для плохого оригинала. jehad 7 лет назад 0
1
Buffalo Rabor

труба в awk ...

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

или же

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

Пожалуйста, прочитайте, поймите и подтвердите этот вопрос:

Есть ли ioreg -c AppleBluetoothHIDKeyboardвыход команды только что одна строка, или делает это также выход других линий (которые содержат цифры)?


Поскольку вы хотите получить результат Keyboard Battery: 17, который не даст ни один из опубликованных ответов, вы можете

Построить на ответ Джехад :

Если ioregкоманда выводит только BatteryPercentстроку, то

echo "Батарея клавиатуры: $ (ioreg -c AppleBluetoothHIDKeyboard | grep -oE '[0-9] +')"

Но если, как я подозреваю, ioreg -c AppleBluetoothHIDKeyboardкоманда выводит другие строки (которые содержат числа), помимо "BatteryPercent" =строки, то приведенная выше команда также выведет много других строк с числами.

Если, как вы неявно подтвердили, что ioregкоманда выводит другие строки (которые содержат число), то

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

Пересмотренный ответ jehad может сработать, если ioregкоманда выводит только BatteryPercentстроку, хотя может потребовать небольших изменений.

Развивайте ответ Буффало Rabor в :

Пересмотренный ответ Буффало Рабора сработает, при условии, что он содержит явные скобки в выходных данных. Но это может быть упрощен - вы вряд ли когда - нибудь понадобится, чтобы трубы grepв awk:

ioreg -c AppleBluetoothHIDKeyboard | awk '/BatteryPercent/ ' 

PS

У меня тоже нет Mac, поэтому я не могу быть уверен, что будет работать для вас, а что нет.

echo "Keyboard Battery: $ (ioreg -c AppleBluetoothHIDKeyboard | grep -oE '[0-9] +')" выводит многие другие строки с числами, как и вторая и третья команды, которые вы указали. Кроме того, ответы как Буффало, так и Джехада не работают, а ревизия Джехада приводит к sed: 1: "s /.*" ([[: digit:]] *) ". * / ...": \ 1 не определено во втором варианте RE и Buffalo, хотя раньше он выводил по-другому, теперь выводит = '| awk' '"BatteryPercent" = 51 awk: не может открыть файл Строка источника BatteryPercent № 1 D4rKP01s0n 7 лет назад 0
Как я и @ G-Man предупредили, у нас нет Mac. И мы можем тестировать только на нашем GNU sed, который почти наверняка не такой, как в Mac OS. Если вы экспериментируете, я уверен, что вы можете использовать один из наших решений. Например, ошибка «\ 1 не определено» может означать, что вам нужно использовать «\» перед скобками, поэтому часть `([[: digit:]] *)` становится `\ ([[: digit:]] * \) `. jehad 7 лет назад 0
@ D4rKP01s0n: Было бы необычно, если бы команда работала один день и взрывно проваливалась на следующий день, если в это время в систему не были внесены катастрофические изменения. Скорее всего, вы допустили опечатку. В частности, если вы получаете сообщение об ошибке, начинающееся с `= '| awk`, вы, вероятно, ошиблись в кавычках. G-Man 7 лет назад 0