[英]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.