gpt4 book ai didi

json - 用jq解析JSON格式

转载 作者:行者123 更新时间:2023-11-29 09:06:30 27 4
gpt4 key购买 nike

我需要解析 lsblk 的输出。由于我是在脚本中执行此操作,因此我需要标准化格式的输出。因此我选择了 JSON 格式作为输出。这是带有一些示例输出的命令:

# lsblk -o NAME,MOUNTPOINT -J
{
"blockdevices": [
{"name": "sda", "mountpoint": null,
"children": [
{"name": "sda1", "mountpoint": "/sda1/mountpoint"},
{"name": "sda2", "mountpoint": null,
"children": [
{"name": "sda2_mapper", "mountpoint": "/sda2/mountpoint"}
]
},
{"name": "sda3", "mountpoint": null},
{"name": "sda4", "mountpoint": null}
]
},
{"name": "sdb", "mountpoint": null,
"children": [
{"name": "sdb1", "mountpoint": "/sdb1/mountpoint"},
{"name": "sdb2", "mountpoint": null}
]
},
{"name": "sdc", "mountpoint": null}
]
}

我想提取所有 innermost 节点的名称,即没有子节点的所有节点的名称。上述示例的所需输出为:

sda1
sda2_mapper
sda3
sda4
sdb1
sdb2
sdc

我选择的工具是 jq,这是我最近才发现的。我试过了

# jq '.blockdevices[].children[]?.name?'

但这只过滤了第一层的名字。我也试过

# jq 'recurse(.name?)'

但这会返回整个文件。

有没有办法只返回没有子节点的节点,无论它们嵌套多深?

PS:我有能力在bashawk 中实现需求。但是,我更喜欢使用像 jq 这样的工具的解决方案,它的特定目的是解析 json 文件。

最佳答案

我认为这不是最简单的方法,但它似乎有效:

$ jq -r '.blockdevices[] | .. | objects | select(has("children")|not)| .name' tmp.json
sda1
sda2_mapper
sda3
sda4
sdb1
sdb2
sdc

它递归地输出在 JSON 中找到的每个值,首先过滤掉任何不是对象的东西,然后是任何具有 children 键的对象。最后,您可以从每个剩余对象中选择 name 值。

关于json - 用jq解析JSON格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41150539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com