从API返回的JSON中提取唯一独立IP地址的技术求助
从API返回的JSON中提取去重的独立IP地址
需求说明
我通过API获取了多组如下格式的JSON数据:
{ "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": [] }] }
需要从中提取独立的IP地址(排除子网段),且每个IP仅保留一次,期望输出格式为每行一个IP:
135.138.168.78 135.138.168.79
遇到的问题
- 使用grep、awk结合正则提取时,要么输出包含重复IP,要么混入子网段,无法得到符合要求的结果。
- 使用jq命令时多次报错:
- 执行
jq --raw-output '.addresses[]'提示Cannot iterate over null (null) exit status 5,添加?后无输出; - 尝试
.result.addresses[]或.status.addresses[]提示Cannot index string with string "addresses" exit status 5。
- 执行
解决方案
正确的jq命令写法
因为JSON结构中addresses嵌套在result数组的元素内,需先遍历result数组,再提取目标字段,同时结合系统命令去重:
# 从addresses字段提取并去重 jq --raw-output '.result[] | .addresses[]' your_file.json | sort -u
如果想依赖更底层的address_details字段提取(避免addresses字段缺失的情况),可以用:
jq --raw-output '.result[] | .address_details[].address' your_file.json | sort -u
命令解释
.result[]:遍历顶层的result数组,取出数组内的每个对象;.addresses[]/.address_details[].address:提取对应字段下的所有IP地址;sort -u:对输出的IP进行排序并去重,确保每个IP仅出现一次。
如果担心字段可能不存在导致报错,可添加?做容错处理:
jq --raw-output '.result[]?.addresses[]?' your_file.json | sort -u
内容的提问来源于stack exchange,提问作者ksmm
相关产品推荐
相关产品推荐

