从命令(或文件)中获取 IP 地址(但不是子网)并将它们每行一个输出到新文件

问题描述 投票:0回答:2
{
    "status": "success",
    "result": [{
        "address_details": [{
                "address": "135.138.168.78",
                "serviceType": "go_gateway",
                "addressType": "active",
                "create_time": 1631879023,
                "allow_listed": false
            },
            {
                "address": "135.138.168.79",
                "serviceType": "gp_gateway",
                "addressType": "active",
                "create_time": 1631879023,
                "allow_listed": false
            }
        ],
        "zone": "Germany",
        "addresses": [
            "135.138.168.78",
            "135.138.168.79"
        ],
        "zone_subnet": [
            "137.183.192.0/18",
            "208.27.0.0/16",
            "34.3.0.0/16",
            "34.199.0.0/16",
            "66.59.192.0/19",
            "165.11.128.0/17",
            "135.138.0.0/16",
            "130.141.0.0/16",
            "165.185.0.0/16"
        ],
        "addresses_v6": [],
        "address_details_v6": []
    }]
}

这是我使用 API 提取的命令的一些经过清理的假示例输出。

我只需要实际的 IP 地址,不需要子网,而且我只需要 IP 地址一次。

从上面的例子中,希望的输出只是两行的两个 IP 地址,就像这样

135.138.168.78
135.139.168.79

这只是输出/文件中大约 10 个输出的一个块,所有格式都像这样。

使用我平庸的技能和正则表达式,我尝试使用 grep 和 awk 提取此信息但没有真正成功,在我的输出中获得 IP 地址的倍数,或者 IP 和子网。

编辑 - 使用经过验证的 JSON 更新。

  • 现在使用命令出现错误 jq --raw-output '.addresses[]'

“jq:错误(在:37):无法迭代空(空) 退出状态 5"

尝试添加一个?在方括号之后,它什么都不输出。

尝试做 '.result.addresses[]' 或 '.status.addresses[]'

get "jq: error (at :37): Cannot index string with string "addresses" 退出状态 5"

awk sed grep ip jq
2个回答
2
投票

假设输入是有效的 JSON(您提供的示例需要以下修复才能将其转换为一个(请参阅 https://www.json.org/ 上的规范):

  • 文档不能只以字段名称开头,在这里

    "address_details":
    ,你必须用花括号打开一个对象
    {
    - 就像你do最后关闭它一样。

  • 字符串必须包裹成双引号 (

    "
    )。对于
    "zone": “Germany”
    你可以看到
    “Germany”
    使用了不同的。

),那么下面的stedolan/jq过滤器就可以提取你想要的东西了:

  • .addresses
    遍历到
    "addresses"
    字段名下的数组
  • .[]
    遍历该数组的项目(当与字段名称收缩时,省略初始点)
  • --raw-output
    标志将输出转换为原始文本(直到那时它们是 JSON 字符串,即如上所述包裹在引号中)
jq --raw-output '.addresses[]' file.json
135.138.168.78
135.138.168.79

如果在你的调用环境中你正在使用管道(一个程序产生 JSON 输出,你想在运行时处理它而不先将它保存到文件中),jq 也可以从标准输入读取:

… | jq --raw-output '.addresses[]'

要轻松玩转 jq,请访问 https://jqplay.org/。在左上框中输入 jq 过滤器(在本例中为

.addresses[]
),在左下框中输入 JSON,(仍然是 JSON 编码的)结果立即显示在右侧。勾选读取
Raw Output
的复选框以应用我们之前使用的
--raw-output
标志。在输入框下方,您会看到一个可以在命令行上使用的命令,该命令是根据您在上面所做的输入编译而来的。按照这个例子,它现在应该读作
jq --raw-output '.addresses[]'
。这里有一个链接可以让你直接进入这个最终状态:https://jqplay.org/s/BMmPjsL6sUT(在网站维护者决定重置网站之前有效,这种情况时不时发生。)

要深入了解 jq 语言,请查看 jqplay.org 网站底部的(可点击的)示例,并在 https://stedolan.github.io/jq/manual/ 查阅手册。


0
投票
cat <file> | grep -Eo '"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"' | tr -d '"' | sort -u

应该做

© www.soinside.com 2019 - 2024. All rights reserved.