Como apenas retornar dois números após a correspondência regex com grep ou sed?

1

Estou escrevendo um script de shell para ser executado na inicialização que desativa meu nó de rastreamento que está agindo. Eu começo com xinput list , que canalizo para grep Stick , que eu preciso canalizar para algo como grep id= que me dá os dois números, geralmente 11. os números estão em qualquer lugar de 1 a 18, até onde eu sei, mas eu preciso escrever algo como foo=xinput list | grep Stick | grep id= e define foo para 11. aqui está o exemplo da lista xinput:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=10   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick             id=11   [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)]
↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
↳ Toshiba input device                      id=12   [slave  keyboard (3)]
↳ TOSHIBA Web Camera - FHD                  id=13   [slave  keyboard (3)]

O que eu preciso é o número logo após id = na linha Stick, 11.

    
por M. Loewenthal 21.11.2017 / 04:29

2 respostas

0

Para encurtar a história, aqui está o comando que você quer:

foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"

Segue uma explicação mais detalhada.

Você deve ser capaz de fazer o que quiser com grep e uma expressão regular que inclua uma declaração de aprovação . O ingrediente principal é a seguinte expressão grep :

grep -Po '(?<=id=)\d\d?'

Isso irá corresponder substrings que começam com id= e são seguidas por um ou dois dígitos, mas retornarão apenas os dígitos e não o prefixo id= .

Veja como você pode testar isso:

echo "id=11" | grep -Po '(?<=id=)\d\d?'

Isso produz 11 como sua saída. Aplicar isso ao seu snippet de código gera o seguinte:

foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"

Como segundo teste, suponha que colocamos seus dados de exemplo no arquivo data.txt :

# data.txt
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=10   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick             id=11   [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)]
↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
↳ Toshiba input device                      id=12   [slave  keyboard (3)]
↳ TOSHIBA Web Camera - FHD                  id=13   [slave  keyboard (3)]

Em seguida, execute o seguinte comando:

cat data.txt | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?'

Isso produz 11 como saída.

    
por 21.11.2017 / 04:37
0

Especifique AlpsPS/2 ALPS DualPoint Stick para xinput

Ao especificar o nome do dispositivo, se conhecido, xinput irá --list apenas desse dispositivo, que você pode restringir a --id-only :

O comando:

xinput --list --id-only 'AlpsPS/2 ALPS DualPoint Stick'

retornará o valor de ID do dispositivo especificado:

11
    
por 21.11.2017 / 04:56

Tags