grep: como mostrar apenas uma palavra depois de encontrada?

3

Eu gostaria de escrever um script para desativar o teclado. Eu escrevo xinput disable 13 como id = 13 do teclado interno. Mas e se o 'id' mudar de alguma forma? Então não vai mais funcionar. É por isso que tenho que escrever um script melhor, aquele que usa o grep.

Por enquanto, eu tenho isso

xinput list|grep AT|grep id=
↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]

Eu adicionei cut -f 2 ao meu comando, então ele mostra isso > id = 13 Então, por enquanto, eu tenho 'id = 13', mas eu preciso apenas 13, sem id =, então eu poderia atribuir esse valor para alguma variável, para passá-lo para xinput disable $variable

Alguém pode me ajudar a completar meu roteiro?

    
por alexa 05.05.2013 / 13:44

5 respostas

2

Isso deve funcionar para você.

xinput list|grep AT|grep id=|cut -f 2|cut -f 2 -d =

O comando

cut tem uma opção para especificar o delimitador.

xinput list|grep AT|grep id=|cut -f 2

Isso lhe dá id=13 , então passe para outro comando de corte especificando o delimitador como =

Amostra

~$ xinput 
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Dell Premium USB Optical Mouse            id=10   [slave  pointer  (2)]
⎜   ↳ DualPoint Stick                           id=15   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=16   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Dell Dell USB Keyboard Hub                id=11   [slave  keyboard (3)]
    ↳ Dell Dell USB Keyboard Hub                id=12   [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_FHD              id=13   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                          id=17   [slave  keyboard (3)]
~$ xinput list|grep AT|grep id=|cut -f 2|cut -f 2 -d =
14
    
por thefourtheye 05.05.2013 / 13:53
2

Você não precisa especificar um índice numérico, os seguintes comandos são suficientes:

xinput --disable 'AT Translated Set 2 keyboard'

Dê uma olhada na página de manual do xinput para mais receitas.

Se você quiser analisar o ID usando o grep, poderá usar o seguinte:

$ xinput list | grep -Po 'AT.*id=\K[0-9]+'
13

Para obter mais detalhes sobre \K , consulte O grep pode produzir apenas agrupamentos especificados que correspondem? .

    
por Lekensteyn 05.05.2013 / 16:15
1

Então você quer uma substring?

string=$(xinput | grep HID | cut -f 2);
echo ${string:3}

Isso não funciona no shell apenas no bash

chad@M4A79XTD-EVO:~$ xinput 
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ HID 04b4:0033                             id=8    [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
chad@M4A79XTD-EVO:~$ string=$(xinput | grep HID | cut -f 2);echo ${string:3}
8
    
por GM-Script-Writer-62850 05.05.2013 / 13:52
0

Mesmo que você possa usar o grep para isso, eu acho que você ficaria melhor com sed aqui:

xinput list | sed -nr 's/.*AT.*keyboard.*id=([0-9]*).*//p'
    
por Thor 05.05.2013 / 15:34
0

Embora isso seja antigo, leva-me à minha solução, que é muito mais simples do que as respostas anteriores. Verificando as man pages como Lekensteyn sugeriu e foi isso que eu encontrei.

# Keyboard, TouchPad, Mouse, etc...
DvcName='xinput list --name-only | grep "QueryYourDevice"'
DvcId='xinput list --id-only "$DvcName"'       # Save Device Id.....

Agora, você tem o nome do dispositivo e o ID armazenados e pode ser usado facilmente em todo o script.

    
por Opsman 06.03.2015 / 00:30

Tags