使用格式化返回JQ中的多个块

时间:2018-11-09 15:50:28

标签: amazon-web-services jq aws-cli

我将以下json输入:

[
    {
        "ENVIRONMENT": [
            "sit"
        ], 
        "Usage": [], 
        "id": "i-098a99bd2bd0ac86b", 
        "Name": [
            "instance1"
        ]
    }, 
    {
        "ENVIRONMENT": [
            "uat"
        ], 
        "Usage": [
            "testing"
        ], 
        "id": "i-0b210876db6d028f3", 
        "Name": [
            "instance2"
        ]
    }
]

我可以使用jq '.[] | [.id, .ENVIRONMENT[], .Usage[], .Name[]]'来获得以下信息:

[
  "i-098a99bd2bd0ac86b",
  "sit",
  "instance1"
]
[
  "i-0b210876db6d028f3",
  "uat",
  "testing",
  "instance2"
]

或者我可以使用jq '.[] | {id: .id, env: .ENVIRONMENT[], usage: .Usage[], name: .Name[]}'来获得以下内容(它仅返回一个实例):

{
  "id": "i-0b210876db6d028f3",
  "env": "uat",
  "usage": "testing",
  "name": "instance2"
}

有没有一种方法可以获取第二个方法的格式,但是像第一个方法给我的那样返回所有实例?我想对于其中一个实例中不存在的标记,用法将为空或为空。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下jq过滤器:

jq '.[]|{id,env:.ENVIRONMENT[],usage:(.Usage[]//null),name:.Name[]}' file

与您几乎相同,除了.Usage[]//null给出Usage或不显示null之外。

请注意,您的首次尝试与以下操作相同:

jq '.[]|flatten' 

(尽管需要jq 1.5)

答案 1 :(得分:0)

通常,在操作OP时多次使用。[]时必须格外小心。如果只需要每个数组中的第一项,则可以按以下方式使用.[0]

.[]
| {id, env: .ENVIRONMENT[0], usage: .Usage[0], name: .Name[0]}

(这种方法可以很好地处理某些数组为空的情况。)

如果(例如).ENVIRONMENT数组可能包含多个项目,则可能需要考虑另一种变体,例如:

.[]
| range(0; .ENVIRONMENT|length) as $i
| {id, env: .ENVIRONMENT[$i], usage: .Usage[$i], name: .Name[$i]}