从以下输出中获取鼠标的 MAC 地址的最方便的方法是什么:
~ ➜ bt-device --list
Added devices:
Logitech K811 (00:1F:20:EB:06:E0)
Plattan ADV Wireless (5C:EB:68:1F:D1:62)
Bluetooth Mouse M336/M337/M535 (34:88:5D:3F:1B:88)
还有比这更短的吗:
bt-device --list | grep Mouse | sed -e 's/^.*(\(.*\))$/\1/'
34:88:5D:3F:1B:88
我正在寻找如下语法:
bt-device --list | grep Mouse | xyztool '(' ')'
答案1
使用 awk 匹配该行并将其拆分为由(
或分隔的单词)
。取第二个单词,或者如果设备名称中可能有括号,$2
最好是倒数第二个单词:$(NF-1)
awk -F '[()]' '/Mouse/{print $(NF-1)}'
答案2
grep
与 PCRE ( ) 一起使用-P
:
bt-device --list | grep -Po 'Mouse\s.*?\(\K[^)]+'
Mouse\s.*?\(
将在该行中匹配Mouse
,然后直到第一个(
,\K
将放弃匹配[^)]+
将为我们提供所需的部分,即下一个字符)
例子:
$ cat file.txt
Added devices:
Logitech K811 (00:1F:20:EB:06:E0)
Plattan ADV Wireless (5C:EB:68:1F:D1:62)
Bluetooth Mouse M336/M337/M535 (34:88:5D:3F:1B:88)
$ grep -Po 'Mouse\s.*?\(\K[^)]+' file.txt
34:88:5D:3F:1B:88
答案3
还有几个选择:
珀尔
$ bt-device --list | perl -lne 'print $1 if /Mouse.*\((.*)\)/' file 34:88:5D:3F:1B:88
在许多处理正则表达式的工具中,括号 (
()
) 用于以稍后可以使用的方式捕获匹配模式。在 Perl 中,第一个捕获的模式是$1
,第二个$2
等等。在这里,我们正在寻找匹配的行Mouse
,然后是括号中的字符串。$1
如果匹配成功, 括号中的内容将被保存并打印。grep + 剪切 + tr
$ bt-device --list grep Mouse | cut -d'(' -f2 | tr -d ')' 34:88:5D:3F:1B:88
在这里,我们用来
grep
查找相关行,cut
打印第二个(
定义的字段 (34:88:5D:3F:1B:88)
) 并tr
删除尾随)
。只是为了好玩,这里有一个解决方案
join
:$ join -1 1 -2 2 -o 2.4 <(echo "Mouse (") <(bt-device --list) 2>/dev/null | tr -d '()' 34:88:5D:3F:1B:88