繁体   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