jq를 사용하여 json 데이터를 구문 분석하는 방법은 무엇입니까?

jq를 사용하여 json 데이터를 구문 분석하는 방법은 무엇입니까?

API를 통해 얻은 json에서 다음 개체를 가져와야 합니다. 우분투 16.04에서 제공되는 jq를 사용하려고합니다. 이 형식으로 데이터를 얻으려고 합니다.device_name C:| free 18707755008.0 total_size 55832473600.0

이 문제를 어떻게 처리해야 하는지 제안해 주실 수 있나요? 목표는 Excel에서 3개 이상의 개체를 얻는 것입니다.

{
    "logical": {
        "D:|": {
            "device_name": [
                "D:\\"
            ],
            "used_percent": [
                52.6,
                "%"
            ],
            "fstype": "NTFS",
            "free": [
                10178084864.0,
                "B"
            ],
            "total_size": [
                21471686656.0,
                "B"
            ],
            "used": [
                11293601792.0,
                "B"
            ],
            "opts": "rw,fixed"
        },
        "C:|": {
            "device_name": [
                "C:\\"
            ],
            "used_percent": [
                66.5,
                "%"
            ],
            "fstype": "NTFS",
            "free": [
                18707755008.0,
                "B"
            ],
            "total_size": [
                55832473600.0,
                "B"
            ],
            "used": [
                37124718592.0,
                "B"
            ],
            "opts": "rw,fixed"
        }
    }
}

답변1

다음은 2줄을 출력하며, 마지막 줄의 문자열 형식은 쉽게 변경할 수 있습니다.

jq -M -r '.[] | keys[] as $var |
 [.[$var].free[0], .[$var].total_size[0]] as [$f,$t] |
 "device_name \($var) free \($f) total_size \($t)" '

산출:

device_name C:| free 18707755008 total_size 55832473600
device_name D:| free 10178084864 total_size 21471686656

답변2

이것을 사용하십시오 :

jq '.logical["D:|"].free[0], .logical["D:|"].total_size[0]' file.json

산출:

10178084864
21471686656

답변3

아래 키에서 직접 장치 이름을 가져오는 대신 아래 device_name키 값에서 장치 이름을 가져오고 싶다고 가정해 보겠습니다 (이 방법은 더 쉽고 Windows 시스템에서 유효한 장치 이름인 값도 제공합니다).logicallogical측정 단위실제 숫자에 추가됩니다(데이터에 가변 단위가 있을 수 있는 경우 의미가 있음).

jq -r '
    ["Device name", "Free space", "Total size"],
    (
        .logical[] |
        [
            .device_name[0],
            (.free       | map(tostring) | add),
            (.total_size | map(tostring) | add)
        ]
    ) | @csv' file.json

질문의 데이터가 주어지면 file.json다음과 같은 CSV 문서가 생성됩니다(Excel로 쉽게 가져올 수 있음).

"Device name","Free space","Total size"
"D:\","10178084864B","21471686656B"
"C:\","18707755008B","55832473600B"

숫자와 단위 사이에 공백을 두려면 두 호출을 각각 addinto로 변경하세요.join(" ")

관련 정보