bash awk 如何排除包含单词“Mouse”的条目

bash awk 如何排除包含单词“Mouse”的条目

以下 bash 命令收集名称包含 ILITEK ILITEK-TP 的所有设备的 xinput id。

name='ILITEK ILITEK-TP'
ids=$(xinput --list |awk -Fid= "/$name/"'{print $2+0}')

这个脚本有效。但是,我想ILITEK ILITEK-TP Mouse从这个 ID 数字列表中排除类似的条目。目前,ILITEK ILITEK-TPILITEK ILITEK-TP Mouse条目都被收集到ids.

答案1

指某东西的用途

awk -Fid= "/$name/"'{print $2+0}'

是一个常见的错误。

你需要:

awk -F'id=' -v name="$name" '$0 ~ name{print $2+0}'

但最好grep在这里使用:

name='ILITEK ILITEK-TP'
xinput --list | grep -oP "${name}.*?id=\K\d+"

正则表达式匹配如下:

节点 解释
${name} 变量名
.*? 除 \n 之外的任何字符(0 次或多次(匹配尽可能少的数量))
id= 'id='
\K 重置比赛的开始(什么是Kept)作为使用后视断言的更短替代方案:环顾四周正则表达式中对 \K 的支持
\d+ 数字 (0-9)(1 次或多次(匹配尽可能多的数量))

答案2

您可以尝试使用grep

xinput --list |grep 'ILITEK ILITEK-TP'|grep -v 'ILITEK ILITEK-TP Mouse'

答案3

awk 有布尔值。所以你应该能够做一些调整:

name='ILITEK ILITEK-TP'
ids=$(xinput --list |awk -Fid= "/$name/"' && !/Mouse/{print $2+0}')

如果这没有帮助,请提供 xinput --list 输出的一些示例行。

(由于引用看起来不正确而进行了编辑。)

相关内容