从 Linux 中的 xinput 输出打印与字符串匹配的设备 ID

从 Linux 中的 xinput 输出打印与字符串匹配的设备 ID

我正在尝试编写一个脚本来自动禁用/启用我的触摸板,bashi3wm为此,我想获取由 的输出报告的触摸板 ID xinput。该脚本的想法是能够在不同的机器之间轻松传输,这就是为什么我想自动提取触摸板的设备 ID。

$ xinput                                                                    
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ DLL07BE:01 06CB:7A13 Mouse                id=14   [slave  pointer  (2)]
⎜   ↳ PS/2 Generic Mouse                        id=22   [slave  pointer  (2)]
⎜   ↳ DLL07BE:01 06CB:7A13 Touchpad             id=15   [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)]
    ↳ Video Bus                                 id=8    [slave  keyboard (3)]
    ↳ Power Button                              id=9    [slave  keyboard (3)]
    ↳ Sleep Button                              id=10   [slave  keyboard (3)]
    ↳ Integrated_Webcam_HD: Integrate           id=13   [slave  keyboard (3)]
    ↳ Intel HID events                          id=16   [slave  keyboard (3)]
    ↳ Intel HID 5 button array                  id=17   [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                          id=18   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=19   [slave  keyboard (3)]

我想要一个单行命令来给idTouchpad.我尝试过awk实施它,我取得的最好成绩是

$ xinput | awk '/Touchpad/ && /id=/ { print $6 } '                          
id=15

问题是第六列并不是每次都是设备 ID,所以我需要首先获取包含的行Touchpad,然后打印后面的数​​字id=并在第一个空白/制表符处剪切。

答案1

对于xinput, 需要一个命令设备参数(如--enable device)可以使用设备的名称或 ID。

例如,这两者都是等效的:

xinput --enable 'DLL07BE:01 06CB:7A13 Touchpad'
xinput --enable 15

如果您事先不知道设备的完整名称,请使用 的输出xinput --list --name-only来查找匹配的名称:

xinput --list --name-only | grep Touchpad
xinput --enable "$(xinput --list --name-only | grep Touchpad | head -n 1)"

如 中所述man 1 xinput,该--list选项还接受设备参数。所以你可以打印给定名称的 id:

xinput --list --id-only 'DLL07BE:01 06CB:7A13 Touchpad'

或给定 id 的名称:

xinput --list --name-only 15

答案2

您可以用于sed以下目的:

xinput | sed '/Touchpad/s/.*id=\([0-9]*\).*/\1/;t;d'

这将通过使用捕获组将找到模式的行的全部内容替换Touchpad为模式中的数字,从而有效地仅打印 ID 部分,并忽略任何不匹配的行(末尾的部分)。id=digits\([0-9]*\);t;d

答案3

使用下面的单个 awk 命令它会正常工作

测试并运行良好

xinput |awk '/Touchpad/{for(i=1;i<=NF;i++){if ($i ~ /id/){print $i}}}' 

输出

id=15

相关内容