Sed正则表达式从文件中提取MAC地址

Sed正则表达式从文件中提取MAC地址

我想知道我需要对正则表达式进行哪些更改才能在 Linux 中使用“sed”(实际上,我在 OpenWRT 中使用(GNU sed v4.8)。我有一个包含 DHCP 租约列表(dhcp.leases)的文件:

1660667709 6a:51:a1:e1:10:48 192.168.0.10 client-1 01:6a:51:a1:e1:10:48
1660667634 6b:52:a2:e2:11:cd 10.33.10.115 user3 01:6b:52:a2:e2:11:cd
1660667533 6c:53:a3:e3:12:0f 192.60.200.20 grumpy-user 01:6c:53:a3:e3:12:0f
1660667538 6d:54:a4:e4:13:ef 192.60.200.34 not-friendly 01:6d:54:a4:e4:13:ef
1660667541 6f:55:a5:e5:14:44 10.73.10.160 some-user *
1660667543 60:56:a6:e6:15:b6 10.22.50.10 another 01:60:56:a6:e6:15:b6
1660667548 61:57:a7:e7:16:16 10.200.4.145 * 01:61:57:a7:e7:16:16
1660667548 62:58:a8:e8:17:65 192.60.200.30 no-user 01:62:58:a8:e8:17:65

我想要一个正则表达式来仅打印特定客户端的第一个 MAC 地址。例如,'grumpy-user' 的正则表达式为 '6c:53:a3:e3:12:0f'。

使用RegExr 网站我创建了一个可以正常工作的正则表达式。它显示了所有组,我可以提取我需要的组(组 1)。即使 MAC 地址以不同的格式表示(使用“-”作为分隔符,或使用点,或者十六进制字符为小写或大写),该表达式也能正常工作:

(([0-9A-Fa-f]{2}[:-\\.]){5}([0-9A-Fa-f]{2}))(.+)(grumpy-user)

使用该网站时,我发现捕获组 1 正是我真正需要的,但我不知道如何将其转换为 sed。有趣的是,我使用了那里创建的正则表达式,似乎效果很好。

无论如何,我尝试过的不起作用的命令是:

cat dhcp.leases | sed -r 's/(([0-9A-Fa-f]{2}[:-\\.]){5}([0-9A-Fa-f]{2}))(.+)(grumpy-user)/\3/g'

我尝试阅读多个答案,试图找出可行的表达方式,但最终一无所获。我也试过grep没有运气。

有人能告诉我我做错了什么吗?正如你所看到的,我不是正则表达式专家!

答案1

好吧,我玩了一会儿之后找到了答案,当然是在我发布之后就出现了。对我有用的是:

cat dhcp.leases.test | sed -rn 's/.*(([0-9A-Fa-f]{2}[:-\\.]){5}([0-9A-Fa-f]{2})).+grumpy-user.*/\1/p'

我不知道这是否是最好的方法,但它可能会对遇到类似问题的人有所帮助。

以防万一,-r开关告诉 sed 使用扩展正则表达式,并且-n开关告诉它不要打印模式空间。

在我的表达式中,我基本上只捕获一个包含 MAC 地址的组(括号之间的部分)。在该组之前,我可以有任何字符,并且该组后面必须跟有任意字符,直到所需的用户名和之后的任何其他剩余字符。使用\1我打印了唯一捕获的组。

相关内容