首页 > 解决方案 > 使用 JQ 和类似过滤器过滤 bash 中的 IPv4 和 IPv6 地址

问题描述

我正在尝试从 Cloudflare 防火墙规则中提取 IPv4 和 IPv6 地址,以便在另一个命令中使用。

json这是我要过滤的完整示例响应:

{
    "result": {
        "id": "78839c481cd8424fa8f0f06abd33b55f",
        "paused": false,
        "description": "Test",
        "action": "block",
        "priority": 1,
        "filter": {
            "id": "68f2efc4fa6e43f584dd4b60aca09901",
            "expression": "(ip.src in {192.168.1.1 192.168.1.2 2408:14c:dc83:9119:f9f6:c105:923:a5e3})",
            "paused": false
        },
        "created_on": "2020-11-02T13:48:31Z",
        "modified_on": "2020-11-02T13:49:02Z"
    },
    "success": true,
    "errors": [],
    "messages": []
}

我只想提取表达式字段内的任何 IPv4 或 IPv6 地址,所以在这种情况下,192.168.1.1 192.168.1.2

我怎样才能做到这一点bash

谢谢!

标签: bashshellsedfilterjq

解决方案


使用您的 JSON,调用如下:

jq -r '.result.filter.expression
  | capture("{(?<ips>[^}]*)}").ips' example.json

将产生 IP 地址字符串:

192.168.1.1 192.168.1.2 2408:14c:dc83:9119:f9f6:c105:923:a5e3

其余的应该很容易航行。


推荐阅读