簡體   English   中英

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作為結果。

使用JSON jq endswith過濾結果:

.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM