了解 grep -oP .... 在脚本中

了解 grep -oP .... 在脚本中

我正在为 debian 编写一个小 bash 脚本。我想找到 IPv4 的第 3 个八位字节并将其推入“ip1”变量,并将最后一个八位字节推入“ip2”变量。经过一番研究后,我发现了一个脚本,它应该给我第一个八位字节,但我不明白这部分:

'(?<=inet )[^.]+' 

有人可以向我解释这一点,以及我如何才能适应我的需要。

我读了这个https://explainshell.com/...所以我知道 -oP 是如何工作的,但仍然不明白最后一部分。

ip1=$(ip a show | grep -oP '(?<=inet )[^.]+')
ip2=$(ip a show | grep -oP '(?<=inet )[^.]+')

答案1

-P意味着grep应该使用 Perl 正则表达式语法,在 Perl 中,(?<=pattern)是一个“零宽度正向后断言",换句话说,应该出现在匹配本身之前的锚点。因此,如果它们跟随在 后面,则匹配不是句点 ( )(?<=inet )[^.]+的非空字符序列,换句话说,是您的各个 IP 地址的第一个字节网络接口,因为输出线,例如.[^.]+"inet "ip address showinet 127.0.0.1/8 scope host lo

这样做是因为-o的选项grep使其输出匹配,并且您不希望"inet "打印该位,即使它对匹配很重要。

问题是您可以仅使用各种 IP 地址的第一个字节做什么,以及为什么ip2设置为与 相同的值ip1。脚本是做什么用的?

对于您的特定需求,例如:

# get last two bytes of IP (assume in 192.168.*. network)
last_two=$(ip a show | grep -oP '(?<=inet 192\.168\.)[^/]+')
# Split result in two
IFS=. read net host <<< $last_two

相关内容