Atualmente, estou tentando analisar a saída de lsblk com jq e filtrá-la com base em alguns critérios.
Dada a seguinte saída de exemplo:
{
"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"
}
]
}
]
}
Eu quero passar por todos os dispositivos de nível superior que possuem fstype "crypto_LUKS". Então, para esses dispositivos, quero verificar se os filhos (se presentes) têm um ponto de montagem (não nulo). Finalmente, quero retornar o nome do dispositivo de nível superior que corresponda aos dois critérios.
Portanto, para o exemplo acima, apenas 1 correspondência seria retornada:
/dev/sdc /dev/mapper/d1
.
O /dev/sdc
dispositivo não seria retornado porque o ponto de montagem do dispositivo filho é nulo/vazio.
Eu já consegui isso até agora:
lsblk -Jpo NAME,FSTYPE,SIZE,MOUNTPOINT | jq -r '.blockdevices[] | select(.fstype == "crypto_LUKS") '
Mas isso verifica apenas os critérios crypto_LUKS, e não os pontos de montagem dos filhos. Também imprime toda a entrada da matriz em vez de apenas os dois valores.
Como posso resolver isso?