我目前正在尝试使用 jq 解析 lsblk 的输出并根据某些标准对其进行过滤。
给定以下示例输出:
{
"blockdevices": [
{
"name": "/dev/sda",
"fstype": null,
"size": "931.5G",
"mountpoint": null,
"children": [
{
"name": "/dev/sda1",
"fstype": "ntfs",
"size": "50M",
"mountpoint": null
},{
"name": "/dev/sda2",
"fstype": "ntfs",
"size": "439.8G",
"mountpoint": null
},{
"name": "/dev/sda3",
"fstype": "vfat",
"size": "512M",
"mountpoint": "/boot/efi"
},{
"name": "/dev/sda4",
"fstype": "ext4",
"size": "491.2G",
"mountpoint": "/"
}
]
},{
"name": "/dev/sdb",
"fstype": "crypto_LUKS",
"size": "200GG",
"mountpoint": null,
"children": [
{
"name": "/dev/mapper/d1",
"fstype": "btrfs",
"size": "200G",
"mountpoint":[
null
]
}
]
},{
"name": "/dev/sdc",
"fstype": "crypto_LUKS",
"size": "100G",
"mountpoint": null,
"children": [
{
"name": "/dev/mapper/abc2",
"fstype": "btrfs",
"size": "100GG",
"mountpoint": "/mnt/test"
}
]
}
]
}
我想查看所有具有 fstype“crypto_LUKS”的顶级设备。然后,对于这些设备,我想检查孩子(如果存在)是否有安装点(不为空)。最后,我想返回与这两个条件都匹配的顶级设备的名称。
因此,对于上面的示例,只会返回 1 个匹配项:
/dev/sdc /dev/mapper/d1
.
由于/dev/sdc
子设备的挂载点为空/空,因此不会返回设备。
到目前为止我已经得到了这个:
lsblk -Jpo NAME,FSTYPE,SIZE,MOUNTPOINT | jq -r '.blockdevices[] | select(.fstype == "crypto_LUKS") '
但这仅检查 crypto_LUKS 标准,而不检查孩子的挂载点。它还打印整个数组条目,而不仅仅是两个值。
我该如何解决这个问题?
要获取块设备的名称及其每个非空子挂载点作为制表符分隔的列表:
由于“空挂载点”实际上不是
null
单个null
值的数组,因此我正在测试挂载点是否为字符串。鉴于问题中的数据,这将返回
要获取满足条件的块设备对象(如果这就是“整个数组”的意思):
这将返回块设备对象,该对象具有该
fstype
值crypto_LUKS
并且至少有一个带有 a是字符串children
的元素。mountpoint
鉴于问题中的数据,这将返回