Como remover texto desnecessário de uma saída da linha de comando?


2

Estou usando o GeekTool, que pega a saída dos comandos do terminal e os transforma em widgets da área de trabalho, e queria exibir a porcentagem atual da bateria do meu teclado bluetooth na área de trabalho na forma de

Bateria do teclado: (valor percentual da bateria)

Para fazer isso, estou usando o comando

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

que é deste site.

No entanto, como mencionado nesse site, este comando gera um texto com aparência não muito limpa (sim, preciso trocar minhas pilhas):

| |   |   |   "BatteryPercent" = 17

(Portanto, para esta entrada, quero a saída Keyboard Battery: 17.) Portanto, minha pergunta é: como faço para converter isso no formato pretendido de "Bateria do teclado: (valor percentual da bateria) " na linha de comando?

EDIT: Encontrei outra maneira de mostrar a porcentagem de bateria, usando o Ubersicht em vez do GeekTool, obrigado a todos pela ajuda


Então você quer Keyboard Battery: 17ou Keyboard Battery: (17)? Ou seja, você quer parênteses literais na saída?
G-Man

Bateria do teclado: 17
D4rKP01s0n

Por favor, não esclareça sua pergunta nos comentários; edite sua pergunta para torná-la mais clara e completa. Muitos de nós se esforçaram para responder sua pergunta. Se você não quiser mais uma resposta, diga e vá embora, e nós o deixaremos em paz. Mas se você deseja uma solução, copie nossas respostas para a sua pergunta e mostre o resultado obtido na sua pergunta . Use copiar e colar de nossas respostas ao seu Terminal e do seu Terminal à sua pergunta.
G-Man

Respostas:


0

Leia, entenda e reconheça esta pergunta:

O ioreg -c AppleBluetoothHIDKeyboardcomando gera apenas essa linha ou também gera outras linhas (que contêm números)?


Como você deseja a saída Keyboard Battery: 17, que nenhuma das respostas postadas até o momento produzirá, é possível

Com base na resposta de jehad :

Se o ioregcomando emitir apenas a BatteryPercentlinha, então

eco "Bateria do teclado: $ (ioreg -c AppleBluetoothHIDKeyboard | grep -oE '[0-9] +')"

Mas se, como suspeito, o ioreg -c AppleBluetoothHIDKeyboardcomando gerar outras linhas (que contêm números), além da "BatteryPercent" =linha, o comando acima também produzirá muitas outras linhas com números.

Se, como você confirmou implicitamente, o ioregcomando gerar outras linhas (que contêm números), então

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

A resposta revisada de jehad pode funcionar se o ioregcomando exibir apenas a BatteryPercentlinha, embora possa exigir pequenas alterações.

Desenvolva a resposta de Buffalo Rabor :

A resposta revisada de Buffalo Rabor funcionará, com a condição de incluir parênteses explícitos na saída. Mas pode ser simplificada - você quase nunca precisa tubulação grepem awk:

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

PS

Também não tenho um Mac, por isso não sei ao certo o que funcionará para você e o que não funcionará.


eco "Bateria do teclado: $ (ioreg -c AppleBluetoothHIDKeyboard | grep -oE '[0-9] +')" gera muitas outras linhas com números, assim como o segundo e o terceiro comando que você forneceu. Além disso, as respostas de Buffalo e jehad não funcionam, com a revisão de jehad resultando em sed: 1: "s /.*" ([[: digit:]] *) ". * / ...": \ 1 não definido na segunda opção do RE e do Buffalo, enquanto estava produzindo diferentes anteriormente, agora gera = '| awk' {print $ 5, $ 6, $ 7} '"BatteryPercent" = 51 awk: não é possível abrir o arquivo número 1 da linha de origem BatteryPercent 1
D4rKP01s0n

Como eu e o @ G-Man avisamos, não temos Mac. E só podemos testar no nosso GNU sed, que quase certamente não é o mesmo que no Mac OS. Se você experimentar, tenho certeza de que pode obter uma variação de uma de nossas soluções para funcionar. Por exemplo, o erro "\ 1 não definido" pode significar que você precisa usar '\' antes dos colchetes, para que a peça ([[:digit:]]*)se torne \([[:digit:]]*\).
jehad 2/16

@ D4rKP01s0n: Seria incomum um comando funcionar um dia e falhar explosivamente no dia seguinte, a menos que mudanças catastróficas tenham sido feitas no sistema nesse ínterim. É mais provável que você tenha cometido um erro de digitação. Em particular, se você receber uma mensagem de erro que começa com ='|awk, provavelmente digitou incorretamente as aspas.
G-Man

1

Para obter apenas o número, altere o " grep" no seu exemplo para o seguinte:

grep -oE '[0-9]+'

Isso deve funcionar (pelo menos a sintaxe grep certamente funcionará no Linux), mas eu não tenho um Mac, então você pode precisar ajustá-lo um pouco para fazê-lo funcionar.

Explicação:

  • O grep acima está extraindo apenas a parte numérica da saída.
  • A opção 'o' diz mostrar APENAS a partida.
  • A opção 'E' diz usar expressão regular para correspondência.
  • '[0-9] +' é a expressão regular para encontrar números (+ significa um ou mais).

Portanto, este comando grep encontrará apenas a parte numérica da string de saída.

..

EDITADO ... após uma segunda leitura, parece que você precisa do número anexado ao final de "Bateria do Teclado:", então aqui está uma solução usando o sed:

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

Nesse caso, você está substituindo a sequência original por uma que comece com "Bateria do teclado:".

Mais uma vez, espero que funcione no Mac!


Ok, obrigado, eu vou tentar fazer isso no meu Mac quando eu voltar a ele e vai marcar este como a resposta se ele funciona
D4rKP01s0n

Você pode querer mudar isso para sed 's/.* \([0-9][0-9]*\).*/Keyboard Battery: \1/'.
G-Man

@ G-Man, por que você precisaria de duas classes de dígitos? O mesmo efeito pode ser obtido com o operador mais (um ou mais); [0-9]+, ou você pode usar uma mão ainda mais curta \d+. Na minha experiência, a [[:digit:]]classe mais detalhada é mais amplamente suportada (como eu disse, não tem um Mac, então queria algo com maior probabilidade de funcionar). O motivo [[:digit:]]*da minha resposta (em vez de [[:digit:]]+) é porque eu não sei a saída possível de ioreg, então é melhor ter uma correspondência do que nenhuma correspondência (nenhuma correspondência retornaria apenas a string original).
jehad

@jehad: Eu uso  RE RE  * porque minha versão do sednão reconhece +. Além disso, ele não reconhece \d. Um problema com o  RE  * é que ele pode corresponder a uma sequência nula. Não entendo por que você prefere isso a não conseguir correspondência; se [[:digit:]]*corresponder a uma cadeia nula, \1será nulo e você alterará a linha de entrada (possivelmente descartando um número em outro lugar da linha). Além disso, acho que sedtrata (e )como caracteres não especiais e precisa \(\)capturar uma substring (→  \1). ... (continua)
G-Man

(Continua) ... Seu comando é falho, pois (1) espera que o número na entrada seja cercado por aspas (não é), (2) insere aspas na sequência de substituição (não desejado) e (3) insere :  na cadeia de substituição duas vezes . Além disso, o ;é desnecessário.
G-Man

1

tubo para awk ...

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

ou

$ioreg -c AppleBluetoothHIDKeyboard |grep '"BatteryPercent" ='|awk '{print "Keyboard Battery: ("$7")"}'
Keyboard Battery: (51)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.