如何使用jq基于Keys过滤JSON?获取Okta IP范围us_cell_开头条目
如何用jq筛选以特定前缀开头的键对应的IP范围
没问题,我来帮你搞定这个jq过滤的需求!你要处理的是Okta的IP范围JSON文件,需要提取所有以us_cell_开头的键对应的ip_ranges——这确实和常见的按值过滤不太一样,我给你几个实用的方案,亲测有效!
核心思路
要针对JSON的键名做过滤,首先得用to_entries把顶层对象转换成键值对数组(每个元素是{"key": "键名", "value": "对应值"}),这样就能方便地对键名进行匹配筛选,之后再根据需要提取或重组数据。
具体命令示例
1. 提取所有us_cell_开头的IP范围并合并成一个数组
如果你只需要所有符合条件的IP列表,不需要保留对应的us_cell_键名,可以用这个命令:
curl https://s3.amazonaws.com/okta-ip-ranges/ip_ranges.json | jq '[to_entries[] | select(.key | startswith("us_cell_")) | .value.ip_ranges[]]'
- 拆解说明:
to_entries[]:把顶层对象拆成一个个键值对条目select(.key | startswith("us_cell_")):筛选键名以us_cell_开头的条目.value.ip_ranges[]:提取每个条目中的ip_ranges数组元素- 外层的
[]:把所有IP元素合并成一个大数组
2. 保留键名和对应的IP范围结构
如果你想保留us_cell_X作为键,对应的值是该单元格的IP范围数组,可以用这个命令:
curl https://s3.amazonaws.com/okta-ip-ranges/ip_ranges.json | jq 'to_entries[] | select(.key | startswith("us_cell_")) | {(.key): .value.ip_ranges}'
- 拆解说明:
{(.key): .value.ip_ranges}会动态生成以原键名为键、IP范围为值的对象
3. 重组为只包含符合条件的键值对的对象
如果你想要得到一个新的JSON对象,只保留us_cell_开头的键及其完整值(包括ip_ranges和其他可能的字段),可以用:
curl https://s3.amazonaws.com/okta-ip-ranges/ip_ranges.json | jq '[to_entries[] | select(.key | startswith("us_cell_"))] | from_entries'
- 拆解说明:
from_entries会把筛选后的键值对数组重新转换为JSON对象
补充小技巧
- 如果需要更灵活的匹配,也可以用正则表达式替代
startswith,比如test("^us_cell_")效果完全一致 - 如果你已经把JSON文件下载到本地,把
curl ...换成cat ip_ranges.json即可运行命令
内容的提问来源于stack exchange,提问作者SSh
相关产品推荐
相关产品推荐

