grep:如何在找到一个单词后仅显示一个单词?

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

有人可以帮我完成我的脚本吗?

答案1

您不必指定数字索引,以下命令就足够了:

xinput --disable 'AT Translated Set 2 keyboard'

请参阅 xinput 手册页以了解更多配方。


如果您想使用 grep 解析 ID,您可以使用以下命令:

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

有关更多详细信息\K,请参阅grep 是否可以仅输出匹配的指定分组?

答案2

这应该对你有用。

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,因此将其传递给另一个 cut 命令,指定分隔符为 =

样本

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

答案3

所以你想要一个子字符串?

字符串=$(xinput | grep HID | cut -f 2);
回显 ${字符串:3}

这在 shell 中不起作用,仅在 bash 中起作用

chad@M4A79XTD-EVO:~$ xinput
⎡ 虚拟核心指针id=2[主指针(3)]
⎜ ↳ 虚拟核心 XTEST 指针 id=4 [从属指针 (2)]
⎜ ↳ HID 04b4:0033 id=8 [从属指针 (2)]
⎣ 虚拟核心键盘id=3[主键盘(2)]
    ↳ 虚拟核心 XTEST 键盘 id=5 [从属键盘 (3)]
    ↳ 电源按钮 id=6 [从属键盘 (3)]
    ↳ 电源按钮 id=7 [从属键盘 (3)]
    ↳ AT 翻译设置 2 键盘 id=9 [从属键盘 (3)]
chad@M4A79XTD-EVO:~$ 字符串=$(xinput | grep HID | cut -f 2);echo ${字符串:3}
8

答案4

虽然这个答案很老了,但它让我找到了比以前的答案简单得多的解决方案。按照 Lekensteyn 的建议检查手册页,这就是我发现的。

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

现在您已经存储了设备名称和 ID,并且可以在整个脚本中轻松使用。

相关内容