您好,在使用命令检查 docker 网络的特征时docker network inspect network59
,我注意到 ipv4 地址的存在,我想编写一个正则表达式来列出在该命令的结果中专门找到的 IPv4 地址。
在此先感谢您的帮助
答案1
不确定正则表达式,但jq
可能会有所帮助。您可以将 jsonpath 传递到单引号中您想要的任何内容。
下面的命令适用于如下所示的 json 来提取网关-
$ docker network inspect bridge | jq -r '.[0].IPAM.Config[0].Gateway'
172.17.0.1
[
{
"Name": "bridge",
"Id": "f6daefc7df41c4ddb9c1620b57986b9b65bb4c9afa939af2b6baa6ef7be0f23f",
"Created": "2023-11-14T10:31:54.319592088Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1454"
},
"Labels": {}
}
]
答案2
perl模块Regexp::Common
有一个正则表达式库,可以匹配许多常见的内容,包括四进制表示法的 IPv4 地址:
docker... | perl -MRegexp::Common=net -lne 'print for m{$RE{net}{IPv4}}g'
请注意,它将231.2.3.45
在内部找到v1231.2.3.456.7
,因为它是有效的 IPv4 地址。向该 IP 地址添加一些上下文可能会有所帮助。例如,您可以将其限制为强制要求 IP 地址前面"
仅包含 或 空格,后跟"
、空格或/
仅包含:
docker... | perl -MRegexp::Common=net -lne '
print for m{(?<=["\s])$RE{net}{IPv4}(?=["\s/])}g'
要报告其值类似于点分四进制十进制格式的 IPv4 地址的 JSON 字符串:
docker... | jq -r '
..|strings|select(test("^\\d{1,3}(\\.\\d{1,3}){3}\\z"))'
Regexp::Common
(不像它所接受的那样严格匹配999.888.777.666
)。