
Estou escrevendo um script de shell para ser executado na inicialização que desativa meu nó de rastreamento que está funcionando mal. Eu começo com xinput list
, que eu canalizo para grep Stick
algo assim grep id=
que me dá os dois números, geralmente 11. os números estão entre 1 e 18, pelo que posso dizer, mas preciso escrever algo como foo=xinput list | grep Stick | grep id=
e conjuntos 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 preciso obter é o número logo após id= na linha Stick, 11.
Responder1
Resumindo, aqui está o comando que você deseja:
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
uma expressão regular que inclua umafirmação de olhar para trás. O ingrediente principal é a seguinte grep
expressão:
grep -Po '(?<=id=)\d\d?'
Isso corresponderá às substrings que começam id=
e são seguidas por um ou dois dígitos, mas retornará apenas os dígitos e não o id=
prefixo.
Aqui está como você pode testar isso:
echo "id=11" | grep -Po '(?<=id=)\d\d?'
Isso produz 11
como saída. Aplicar isso ao seu snippet de código resulta no 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.
Responder2
Especifique AlpsPS/2 ALPS DualPoint Stick
para xinput
Ao especificar o nome do dispositivo, se conhecido, xinput
somente --list
aquele dispositivo, ao qual você pode restringir --id-only
:
O comando:
xinput --list --id-only 'AlpsPS/2 ALPS DualPoint Stick'
retornará o valor do ID do dispositivo especificado:
11