grep: как показать только одно слово после найденного?

Я хотел бы написать скрипт для отключения клавиатуры. Я пишу xinput disable 13 как id встроенной клавиатуры = 13. Но что, если «id» как-то изменится? Тогда это больше не будет работать. Вот почему я должен написать лучший скрипт, который использует grep.

На данный момент я получил это

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

Я добавил cut -f 2 к моей команде, так что она отображает это> id = 13 Итак, на данный момент, я получил 'id = 13', но нужно только 13, без id =, чтобы я мог присвоить это значение некоторой переменной, чтобы передать его xinput disable $variable

Может ли кто-нибудь помочь мне завершить мой сценарий?

3
задан 5 May 2013 в 15:55

5 ответов

Вам не нужно указывать числовой индекс, достаточно следующих команд:

xinput --disable 'AT Translated Set 2 keyboard'

Посмотрите страницу справочника xinput для получения дополнительных рецептов.


Если вы хотите проанализировать идентификатор с помощью grep, вы можете использовать следующее:

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

Для получения дополнительной информации о \K см. . Может ли grep выводить только указанные группы, которые матч? .

0
ответ дан 5 May 2013 в 15:55

Это должно сработать для вас.

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

cut команда имеет возможность указать разделитель.

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

Это дает вам id=13, поэтому передайте его другой команде вырезания, указав разделитель как =

Пример

~$ 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
0
ответ дан 5 May 2013 в 15:55

Итак, вы хотите подстроку?

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

Это не работает в оболочке только в 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
0
ответ дан 5 May 2013 в 15:55

Даже если вы можете использовать grep для этого, я думаю, вам лучше использовать sed здесь:

xinput list | sed -nr 's/.*AT.*keyboard.*id=([0-9]*).*/\1/p'
0
ответ дан 5 May 2013 в 15:55

Хотя это старо, это привело меня к моему решению, которое намного проще, чем предыдущие ответы. Проверка справочных страниц, как предложил Лекенштейн, и вот что я нашел.

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

Теперь у вас есть как имя устройства, так и идентификатор, и вы можете легко использовать его в скрипте.

0
ответ дан 5 May 2013 в 15:55

Другие вопросы по тегам:

Похожие вопросы: