![](/img/trans.png)
[英]How to filter an array of objects based on values of string in an inner array with jq
[英]jq - how to filter values in an inner array without knowing the key
我有以下 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"
]
}
}
我想要实现的是在内部数组的值中搜索.*scsi0$
并获得sdb
作为结果。
.ids | to_entries[] | select(.value[] | endswith("scsi0")) | .key
结果是:
"sdb"
在这里试试: https ://jqplay.org/s/DAhKosXXgiA
首先获取.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"
]
}
...然后将结果通过管道传输到to_entries函数,以将其转换为{key, value}
对象数组, .ids | to_entries
.ids | to_entries
:
[
{
"key": "sda",
"value": [
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi2"
]
},
{
"key": "sdb",
"value": [
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi0"
]
},
{
"key": "sdb1",
"value": [
"lvm-pv-uuid-lvld3A-oA4k-hC19-DXzv-D0Fq-xyME-BwgJid",
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part1"
]
},
{
"key": "sdc",
"value": [
"lvm-pv-uuid-pWes2W-dgYF-l8hG-La48-9ozH-hPdU-MOkOtf",
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi1"
]
}
]
...下一个流对象列表, .ids | to_entries[]
.ids | to_entries[]
:
{
"key": "sda",
"value": [
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi2"
]
}
{
"key": "sdb",
"value": [
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi0"
]
}
{
"key": "sdb1",
"value": [
"lvm-pv-uuid-lvld3A-oA4k-hC19-DXzv-D0Fq-xyME-BwgJid",
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part1"
]
}
{
"key": "sdc",
"value": [
"lvm-pv-uuid-pWes2W-dgYF-l8hG-La48-9ozH-hPdU-MOkOtf",
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi1"
]
}
...并从值流中选择, .ids | to_entries[] | select(.value[])
.ids | to_entries[] | select(.value[])
.ids | to_entries[] | select(.value[])
where value endwith "scsi0", select(.value[] | endswith("scsi0"))
:
{
"key": "sdb",
"value": [
"scsi-0QEMU_QEMU_HARDDISK_drive-scsi0"
]
}
...最后,获取键值.ids | to_entries[] | select(.value[] | endswith("scsi0")) | .key
.ids | to_entries[] | select(.value[] | endswith("scsi0")) | .key
.ids | to_entries[] | select(.value[] | endswith("scsi0")) | .key
:
"sdb"
命令行:
jq '.ids | to_entries[] | select(.value[] | endswith("scsi0")) | .key'
在这里试试: https ://jqplay.org/s/DAhKosXXgiA
.ids | to_entries[] | select(.value[] | test(".*scsi0$")) | .key
如果数组中的任何值与您的正则表达式匹配,将打印密钥。
如果没有匹配,将没有输出。
to_entries
用于轻松捕获对象的键。
select
以过滤值
.value[] | test(".*scsi0$")
.value[] | test(".*scsi0$")
检查每个值到正则表达式
.key
我们显示结果的关键
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.