
現在、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」であるすべてのトップレベルデバイスを調べます。次に、それらのデバイスについて、子 (存在する場合) にマウントポイント (null ではない) があるかどうかを確認します。最後に、両方の条件に一致するトップレベルデバイスの名前を返します。
したがって、上記の例では、一致するものが 1 つだけ返されます
/dev/sdc /dev/mapper/d1
。
/dev/sdc
子デバイスのマウントポイントが null/空であるため、デバイスは返されません。
これまでにこれを入手しました:
lsblk -Jpo NAME,FSTYPE,SIZE,MOUNTPOINT | jq -r '.blockdevices[] | select(.fstype == "crypto_LUKS") '
しかし、これは crypto_LUKS 基準のみをチェックし、子のマウントポイントはチェックしません。また、2 つの値だけではなく、配列エントリ全体を出力します。
これをどうすれば解決できますか?
答え1
ブロック デバイスの名前と、その null 以外の子マウント ポイントをタブ区切りリストとして取得するには、次のコマンドを実行します。
jq -r '
.blockdevices[] | select(.fstype == "crypto_LUKS") as $dev |
$dev.children[]? | select(.mountpoint | type == "string") as $mp |
[ $dev.name, $mp.name ] | @tsv'
「null マウント ポイント」は実際にはnull
単一の値の配列であるためnull
、代わりにマウント ポイントが文字列であるかどうかをテストします。
質問のデータから判断すると、
/dev/sdc /dev/mapper/abc2
基準を満たすブロック デバイス オブジェクトを取得するには (「配列全体」が意味するものである場合):
jq '.blockdevices[] |
select(.fstype == "crypto_LUKS" and
any(.children[]?; .mountpoint | type == "string"))'
fstype
これは、値を持ち、文字列である要素crypto_LUKS
を少なくとも 1 つ持つブロック デバイス オブジェクトを返します。children
mountpoint
質問のデータから判断すると、
{
"name": "/dev/sdc",
"fstype": "crypto_LUKS",
"size": "100G",
"mountpoint": null,
"children": [
{
"name": "/dev/mapper/abc2",
"fstype": "btrfs",
"size": "100GG",
"mountpoint": "/mnt/test"
}
]
}