web-dev-qa-db-fra.com

grep: comment afficher un seul mot après en avoir trouvé un?

Je voudrais écrire un script pour désactiver le clavier. J'écris xinput disable 13 comme id du clavier intégré = 13. Mais que se passe-t-il si l'id change d'une façon ou d'une autre? Alors ça ne marchera plus. C'est pourquoi je dois écrire un meilleur script, celui qui utilise grep.

Pour l'instant, j'ai ce

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

J'ai ajouté cut -f 2 à ma commande, donc il affiche ceci> id = 13 Donc, pour l'instant, j'ai 'id = 13', mais je n'ai besoin que de 13, sans id =, donc je pourrais assigner cette valeur à une variable, pour la passer à xinput disable $variable

Quelqu'un peut-il m'aider à terminer mon script?

3
alexa

Cela devrait fonctionner pour vous.

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

La commande cut a une option pour spécifier le délimiteur.

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

Cela vous donne id=13, donc passez-le à une autre commande de coupe en spécifiant le délimiteur comme =

exemple

~$ 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
2
thefourtheye

Vous n'avez pas besoin de spécifier un index numérique, les commandes suivantes suffisent:

xinput --disable 'AT Translated Set 2 keyboard'

Jetez un œil à la page de manuel de xinput pour plus de recettes.


Si vous souhaitez analyser l'ID à l'aide de grep, vous pouvez utiliser ce qui suit:

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

Pour plus de détails sur \K, voir Grep ne peut-il afficher que les groupes spécifiés qui correspondent? .

2
Lekensteyn

Vous voulez donc une sous-chaîne?

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

Cela ne fonctionne pas dans Shell uniquement dans bash

chad @ M4A79XTD-EVO: ~ $ xinput 
 ⎡ ID du pointeur du noyau virtuel = 2 [pointeur maître (3)] 
 ⎜ ↳ ID du pointeur du noyau virtuel XTEST = 4 [pointeur esclave (2)] 
 ⎜ ↳ HID 04b4: 0033 id = 8 [pointeur esclave (2)] 
 ⎣ ID du clavier du noyau virtuel = 3 [clavier maître (2)] 
 ↳ ID du clavier du noyau virtuel XTEST = 5 [clavier esclave (3)] 
 Id ID du bouton d'alimentation = 6 [clavier esclave (3)] 
 ↳ ID du bouton d'alimentation = 7 [clavier esclave (3)] 
 ↳ AT Translated Set 2 keyboard id = 9 [slave slave (3)] 
 Chad @ M4A79XTD-EVO: ~ $ string = $ (xinput | grep HID | cut -f 2); echo $ {string: 3} 
 8

Bien que cela soit ancien, cela m'a conduit à ma solution qui est beaucoup plus simple que les réponses précédentes. Vérifier les pages de manuel comme Lekensteyn l'a suggéré et c'est ce que j'ai trouvé.

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

Vous avez maintenant à la fois le nom et l'identifiant de l'appareil stockés et pouvez les utiliser facilement tout au long du script.

0
Opsman

Même si vous pouvez utiliser grep pour cela, je pense que vous feriez mieux avec sed ici:

xinput list | sed -nr 's/.*AT.*keyboard.*id=([0-9]*).*/\1/p'
0
Thor