在命令行中使用jQ搜索对象

时间:2017-10-27 00:31:13

标签: json grep jq

我有一个AWS安全组列表的JSON文件。我正在尝试使用组名获取组ID。该对象如下所示:

{
    "SecurityGroups": [{
        "IpPermissionsEgress": [
            {
                "IpProtocol": "-1",
            }
        ],
        "Description": "launch-wizard-2 created 2017-10-21T09:19:40.007-04:00",
        "GroupName": "MY1SG-PUBLIC-80",
        "VpcId": "vpc-ceed12b7",
        "OwnerId": "712503525534",
        "GroupId": "sg-ee0c979c"
    }]
}

使用jQ,我的尝试如下:

aws ec2 describe-security-groups | jq '.GroupId' ["GroupName": "MY1SG-PUBLIC-80"]

错误: jq: error: Could not open file [GroupName:: No such file or directory jq: error: Could not open file MY1SG-PUBLIC-80]: No such file or directory

2 个答案:

答案 0 :(得分:2)

问题1:格式
https://shapeshed.com/jq-json/
jq的第二个输入是您要读取的文件。如果该值为 - 程序将从内流中读取。

问题2:选择
https://stedolan.github.io/jq/manual/#select(boolean_expression)
要按值选择元素,您应该/可以使用select语句
select(.GroupName == "MY1SG-PUBLIC-80")
jq 'SCOPE | select(.GroupName == "MY1SG-PUBLIC-80") | .GroupId[]' -
其中SCOPE是您要查看的组。如果SCOPE是.[],它将扫描每个json条目。
在此之后,它将此组管理到选择过滤器,并将其向下修剪为仅将GroupName设置为给定值的过滤器。
然后将此结果集通过管道输入密钥过滤器,只返回匹配GroupID的数组。

答案 1 :(得分:1)

  

我正在尝试使用群组名称获取群组ID。

假设输入已被调整以使其有效JSON(*),过滤器:

.SecurityGroups[] | select(.GroupName=="MY1SG-PUBLIC-80") | .GroupId

产生

"sg-ee0c979c"

考虑这个替代过滤器可能是值得的:

.[][]|select(.GroupName=="MY1SG-PUBLIC-80")|.GroupId

(*)最初显示的输入有一个无关的逗号。