编写正则表达式来列出在 docker 网络中找到的 IPv4 地址

编写正则表达式来列出在 docker 网络中找到的 IPv4 地址

您好,在使用命令检查 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)。

相关内容