jq - 像bash一样迭代bash中的对象(aws卷)

时间:2016-03-30 03:19:58

标签: bash jq

我有一些JSON,我已从AWS中提取并使用 jq 格式化(原始代码位于底部),以便为我提供以下输出:

{
  "VolumeId": "vol-11111111",
  "Tags": {
    "Name": "volume1",
    "Finish": "00:00",
    "Start": "00:20",
    "Period": "2"
  }
}
{
  "VolumeId": "vol-22222222",
  "Tags": {
    "Name": "volume2",
    "Period": "1",
    "Start": "00:00",
    "Finish": "00:20"
  }
}
{
  "VolumeId": "vol-33333333",
  "Tags": {
    "Period": "1",
    "Start": "00:00",
    "Name": "volume3",
    "Finish": "00:20"
  }
}

我现在需要做的是提取' VolumeId','期间''开始'并且'完成'。我想迭代这些对象,将它们放入for循环中的4个同名bash变量中。

e.g。

VolumeId="vol-33333333"
Period="1"
Start="00:00"
Finish="00:20"

问题在于,如果我将整个JSON放入变量中,则将其视为单个参数。我可以使用类似mapfile的东西,但是它会把它变成太多的参数 - 例如

}
"Volumes": [
{ 

任何有助于此工作的帮助将不胜感激。最终结果是能够拍摄音量的快照并使用'期间'标记以计算保留等。

- 原JSON:

{
"Volumes": [
    {
        "Attachments": [],
        "Tags": [
            {
                "Value": "volume1",
                "Key": "Name"
            },
            {
                "Value": "00:00",
                "Key": "Start"
            },
            {
                "Value": "00:20",
                "Key": "Finish"
            },
            {
                "Value": "2",
                "Key": "Period"
            }
        ],
        "VolumeId": "vol-11111111"
    },
    {
        "Attachments": [],
        "Tags": [
            {
                "Value": "volume2",
                "Key": "Name"
            },
            {
                "Value": "00:00",
                "Key": "Start"
            },
            {
                "Value": "00:20",
                "Key": "Finish"
            },
            {
                "Value": "2",
                "Key": "Period"
            }
        ],
        "VolumeId": "vol-22222222"
    },
    {
        "Attachments": [],
        "Tags": [
            {
                "Value": "volume3",
                "Key": "Name"
            },
            {
                "Value": "00:00",
                "Key": "Start"
            },
            {
                "Value": "00:20",
                "Key": "Finish"
            },
            {
                "Value": "2",
                "Key": "Period"
            }
        ],
        "VolumeId": "vol-33333333"
    }
]
}

jq 命令:

jq -r '.Volumes[] | {"VolumeId": .VolumeId, "Tags": [.Tags[]] | from_entries}' 

1 个答案:

答案 0 :(得分:2)

cat rawjsonfile |jq -r  '.Volumes[]|({VolumeId}+(.Tags|from_entries))|{VolumeId,Period,Start,Finish}|to_entries[]|(.key+"="+.value)'

rawjsonfile是你的" - 原始JSON"

这个结果是:

VolumeId=vol-11111111
Period=2
Start=00:00
Finish=00:20
VolumeId=vol-22222222
Period=2
Start=00:00
Finish=00:20
VolumeId=vol-33333333
Period=2
Start=00:00
Finish=00:20
  1. 首先将数组展开为json单位
  2. cat rawjsonfile|jq -r '.Volumes[]|({VolumeId}+(.Tags|from_entries))'

    第一步的结果如下:

     {
      "VolumeId": "vol-11111111",
      "Name": "volume1",
      "Start": "00:00",
      "Finish": "00:20",
      "Period": "2"
    }
    {
      "VolumeId": "vol-22222222",
      "Name": "volume2",
      "Start": "00:00",
      "Finish": "00:20",
      "Period": "2"
    }
    {
      "VolumeId": "vol-33333333",
      "Name": "volume3",
      "Start": "00:00",
      "Finish": "00:20",
      "Period": "2"
    }
    

    jq支持加入json对象。

    1. 第二个选择字段
    2. |{VolumeId,Period,Start,Finish}

      3.将其设为键值并加入

      |to_entries[]|(.key+"="+.value)