我正在为 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 show
inet 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