使用jq从数组中选择值

时间:2015-08-25 21:08:54

标签: json parsing jq

我正在尝试使用循环遍历以下json的jq编写查询,并在Name =“efs-docker”的值时返回FileSystemId的值,如果找不到匹配的记录则会跳出脚本。我以为我可以使用foreach循环来完成它,但语法令人困惑。可以使用reduce或select函数来代替吗?

{
   "FileSystems": [
     {
        "SizeInBytes": {
            "Value": 6144
        },
        "Name": "not-docker",
        "CreationToken": "console-db868fd6-ed6d-46f8-9e3e-4501293847f5",
        "CreationTime": 1440519280.0,
        "FileSystemId": "fs-0fdd32a6",
        "NumberOfMountTargets": 3,
        "LifeCycleState": "available",
        "OwnerId": "310444902345"
    },
    {
        "SizeInBytes": {
            "Timestamp": 1440514799.0,
            "Value": 307060736
        },
        "Name": "efs-docker",
        "CreationToken": "console-3b8b33de-dc45-4634-b6e1-882187ac3cd3",
        "CreationTime": 1440426036.0,
        "FileSystemId": "fs-d2c22d7b",
        "NumberOfMountTargets": 3,
        "LifeCycleState": "available",
        "OwnerId": "310444902345"
         }
    ]
}

谢谢, 杰里米

2 个答案:

答案 0 :(得分:3)

多次避免调用jq,从而避免创建多个进程的开销:

jq -r '.FileSystems[] | select(.Name=="efs-docker") | .FileSystemId'

答案 1 :(得分:0)

我成功地使用了这个:

jq '.FileSystems[]' | jq 'select(.Name=="efs-docker")' | jq -r '.FileSystemId'

可能效率不高,但有效。