使用正则表达式获取鼠标MAC地址

使用正则表达式获取鼠标MAC地址

从以下输出中获取鼠标的 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

还有几个选择:

  1. 珀尔

    $ bt-device --list | perl -lne 'print $1 if /Mouse.*\((.*)\)/' file 
    34:88:5D:3F:1B:88
    

    在许多处理正则表达式的工具中,括号 ( ()) 用于以稍后可以使用的方式捕获匹配模式。在 Perl 中,第一个捕获的模式是$1,第二个$2等等。在这里,我们正在寻找匹配的行Mouse,然后是括号中的字符串。$1如果匹配成功, 括号中的内容将被保存并打印。

  2. 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删除尾随)

  3. 只是为了好玩,这里有一个解决方案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
    

相关内容