{
"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:错误(在:37):无法迭代空(空) 退出状态 5"
尝试添加一个?在方括号之后,它什么都不输出。
尝试做 '.result.addresses[]' 或 '.status.addresses[]'
get "jq: error (at :37): Cannot index string with string "addresses" 退出状态 5"
假设输入是有效的 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/ 查阅手册。
cat <file> | grep -Eo '"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"' | tr -d '"' | sort -u
应该做