关于正则表达式匹配结果的问题

关于正则表达式匹配结果的问题

我执行了以下命令

ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]*)/24' | awk '{print "LAN:" $3 }'

为什么结果是“192.168.123.245/24”,而不是这个192.168.123.245

另一个问题是我必须使用 3 美元打印 ip 而不是$1.

答案1

尝试在没有该部分的情况下运行命令awk,您将看到需要什么$3

ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]*)/24'

没有的命令awk会给你这样的东西。

11:    inet 192.168.1.26/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp1s0
21:    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

您可以看到第一列是行号11:21:。然后是inet,第三列是带掩码的ip号。无论您使用 grep 做什么,ip 号码都将始终附加网络掩码。如果您想摆脱网络掩码,您应该使用sed或其他也会更改您找到的行的东西。 Grep 只会显示它找到的内容。

尝试这个:

ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]{1,3})/24' | awk '{print "LAN:" $3 }' | sed -En 's/(LAN:.*)\/24/\1/p'

我相信它可以做得更优雅。

答案2

这应该可以解决问题:

ip addr | grep 'inet.*\/24' | grep -oE '(([0-9]*\.){3}[0-9]*)' | awk '{ print "LAN:"$1 }'

首先 grep 捕获带有 /24 网络的行。下一个匹配 IPv4 地址,-oarg 告诉 grep 仅打印字符串的匹配部分。 awk 会替换字符串开头的“LAN:”。

现在关于为什么您的代码片段按照您的要求工作。如果没有-o键,grep 将打印整个字符串,然后 awk 将打印第三个“参数”,即用空格分隔的第三个“单词”。

相关内容