过滤一行中的第 X 个元素?

过滤一行中的第 X 个元素?

例如,我想得到只有第三个元素当我打电话时,每一行:

xinput --list --short|grep "slave  pointer"

我得到输出:

⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=11   [slave  pointer  (2)]
⎜   ↳ MCE IR Keyboard/Mouse (ite-cir)           id=12   [slave  pointer  (2)]
⎜   ↳ Logitech Unifying Device. Wireless PID:101a   id=14   [slave  pointer  (2)]

我只想获取诸如“SynPS/2 Synaptics TouchPad”之类的名称,...

我在某处看到了一个带有 awk 和 print 的解决方案,但是没有更简单的解决方案来实现这一点没有 awkperl这样的?

答案1

呆呆对于这种事情来说非常简单,但是好的,你也可以使用cut

xinput --list --short|grep "slave  pointer" | cut -f 1

这还包括前导空格和字符。如果您需要摆脱这些,请尝试以下操作:

xinput --list --short|grep "slave  pointer" | cut -f 1 | cut -d" " -f 5-

答案2

如果是第三个元素,则为“SynPS/2”,而不是“SynPS/2 Synaptics TouchPad”

您在这里可以实现的最好结果是报告之前的内容,id=因为它是唯一可以识别设备名称结束位置的内容。

xinput list | sed -n 's/^[ ⎜↳]*\(.*[^[:blank:]]\)[[:blank:]]*id=.*slave  pointer.*/\1/p'

或者使用带有 PCRE 支持(-P选项)构建的 GNU grep:

xinput list | grep -Po '[^ ⎜↳].*?(?=\s+id=.*slave  pointer)'

相关内容