jq를 사용하여 lsblk 구문 분석

jq를 사용하여 lsblk 구문 분석

현재 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 기준만 확인합니다. 또한 두 값뿐만 아니라 전체 배열 항목을 인쇄합니다.

이 문제를 어떻게 해결할 수 있나요?

답변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마운트 지점이 문자열인지 테스트하고 있습니다.

질문의 데이터가 주어지면 이는 다음을 반환합니다.

/dev/sdc        /dev/mapper/abc2

조건을 만족하는 블록 장치 객체를 얻으려면("전체 배열"이 의미하는 경우):

jq '.blockdevices[] |
    select(.fstype == "crypto_LUKS" and
           any(.children[]?; .mountpoint | type == "string"))'

그러면 해당 fstype값이 포함된 블록 장치 개체 crypto_LUKS와 문자열이 포함된 하나 이상의 요소가 반환됩니다.childrenmountpoint

질문의 데이터가 주어지면 이는 다음을 반환합니다.

{
  "name": "/dev/sdc",
  "fstype": "crypto_LUKS",
  "size": "100G",
  "mountpoint": null,
  "children": [
    {
      "name": "/dev/mapper/abc2",
      "fstype": "btrfs",
      "size": "100GG",
      "mountpoint": "/mnt/test"
    }
  ]
}

관련 정보