jq如何在未知键名场景下过滤内层数组的正则匹配值
问题场景
给定如下JSON结构的磁盘设备映射数据:
{ "ids": { "sda": [ "scsi-0QEMU_QEMU_HARDDISK_drive-scsi2" ], "sdb": [ "scsi-0QEMU_QEMU_HARDDISK_drive-scsi0" ], "sdb1": [ "lvm-pv-uuid-lvld3A-oA4k-hC19-DXzv-D0Fq-xyME-BwgJid", "scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part1" ], "sdc": [ "lvm-pv-uuid-pWes2W-dgYF-l8hG-La48-9ozH-hPdU-MOkOtf", "scsi-0QEMU_QEMU_HARDDISK_drive-scsi1" ] } }
需求规则:
- 遍历
ids对象下所有键对应的内层数组 - 查找数组内存在匹配正则
.*scsi0$的条目 - 返回该数组对应的上层键名,预期输出结果为
sdb
jq实现方案
使用如下jq命令即可完成匹配查询:
jq -r '.ids | to_entries[] | select(any(.value[]; test(".*scsi0$"))) | .key' 你的数据文件路径
语句逻辑说明:
- 首先定位到JSON中的
ids节点 - 通过
to_entries将键值对对象转换为{key: 设备名, value: 对应设备别名数组}的条目列表 - 用
select搭配any筛选出数组中至少有一个元素匹配目标正则的条目 - 最终输出符合条件条目的
key字段,就是目标设备名
执行命令后会直接返回预期结果:
sdb
内容的提问来源于stack exchange,提问作者Stefan Lipinski
相关产品推荐
相关产品推荐

