jqを使ってjsonデータを解析する方法は?

jqを使ってjsonデータを解析する方法は?

APIを介して取得したjsonから次のオブジェクトを取得する必要があります。 Ubuntu 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(" ")

関連情報