使用JQ为没有命名属性的嵌套json文件提取对象

时间:2016-05-23 16:35:20

标签: json jq

我有一个生成的文件(来自amazon CLI)并希望提取一些属性。通常,使用JQ会很简单,但JSON文件没有命名的顶级属性。

[
    [
        {
            "State": "running", 
            "Type": "c4.xlarge", 
            "ID": "i-somehere", 
            "Env": [
                "prd"
            ], 
            "Name": [
                "some url here"
            ]
        }
    ],
    [
        {
            "State": "stopped", 
            "Type": "c4.xlarge", 
            "ID": "i-somehere", 
            "Env": [
                "prd"
            ], 
            "Name": [
                "some url here"
            ]
        }
    ], 
[
        {
            "State": "running", 
            "Type": "c4.2xlarge", 
            "ID": "i-somehere", 
            "Env": [
                "prd"
            ], 
            "Name": [
                "some url here"
            ]
        }
    ]
]

.....我想提取州,环境和名称....这应该是简单的jq"。[]。州" ...但是State嵌套在一个没有命名的对象中。如何用JQ提取?

2 个答案:

答案 0 :(得分:1)

如果您希望所有具有任何对象的对象具有三个属性,则无论对象出现在何处,都可以使用..。例如,对于给定的输入,

jq '.. | objects | select(has("State") or has("Env") or has("Name")) | {State, Env, Name}' 

产生

{
  "State": "running",
  "Env": [
    "prd"
  ],
  "Name": [
    "some url here"
  ]
}
{
  "State": "stopped",
  "Env": [
    "prd"
  ],
  "Name": [
    "some url here"
  ]
}
{
  "State": "running",
  "Env": [
    "prd"
  ],
  "Name": [
    "some url here"
  ]
}

答案 1 :(得分:0)

如果它们只是您感兴趣的对象数组的数组,则可以通过遍历每个数组将其展平为对象。然后获得你想要的属性。

.[][] | { State, Env, Name }