【问题标题】:Using jq find key/value pair based on another key/value pair使用 jq 根据另一个键/值对查找键/值对
【发布时间】:2020-03-05 13:07:19
【问题描述】:

我在这里粘贴了一个 JSON 示例数据,需要一些操作才能获得所需的输出,在下一节中提到要在这段 JSON 代码之后阅读。

我想使用 jq 来解析我想要的数据。

{
"MetricAlarms": [
    {
        "EvaluationPeriods": 3,
        "ComparisonOperator": "GreaterThanOrEqualToThreshold",
        "AlarmActions": [
            "Unimportant:Random:alarm:ELK2[10.1.1.2]-Root-Disk-Alert"
        ],
        "AlarmName": "Unimportant:Random:alarm:ELK1[10.1.1.0]-Root-Alert",
        "Dimensions": [
            {
                "Name": "path",
                "Value": "/"
            },
            {
                "Name": "InstanceType",
                "Value": "m5.2xlarge"
            },
            {
                "Name": "fstype",
                "Value": "ext4"
            }
        ],
        "DatapointsToAlarm": 3,
        "MetricName": "disk_used_percent"
    },
    {
        "EvaluationPeriods": 3,
        "ComparisonOperator": "GreaterThanOrEqualToThreshold",
        "AlarmActions": [
            "Unimportant:Random:alarm:ELK2[10.1.1.2]"
        ],
        "AlarmName": "Unimportant:Random:alarm:ELK2[10.1.1.2]",
        "Dimensions": [
            {
                "Name": "path",
                "Value": "/"
            },
            {
                "Name": "InstanceType",
                "Value": "r5.2xlarge"
            },
            {
                "Name": "fstype",
                "Value": "ext4"
            }
        ],
        "DatapointsToAlarm": 3,
        "MetricName": "disk_used_percent"
    }
]
}

因此,当我将一些 Key1 和 value1 作为参数 "Name": "InstanceType", 传递给 JQ 时,可能使用 cat | jq 和预期输出应如下所示

m5.2xlarge
r5.2xlarge

【问题讨论】:

    标签: json jq


    【解决方案1】:

    一种在输入中递归搜索键值对 (sk-sv) 并从找到的对象中提取另一个键的值 (pv) 的通用方法:

    jq -r --arg sk Name         \
          --arg sv InstanceType \
          --arg pv Value        \
    '.. | objects | select(contains({($sk): $sv})) | .[$pv]' file
    

    【讨论】:

    • 那么这个sk-sv叫什么?
    • @theborngeek 无关紧要。你可以称它为键值对我猜
    • jq -r --arg sk Name \ > --arg sv InstanceType \ > --arg pv Value \ > '.. | objects | select(contains({($sk): $sv})) .[$pv]' cloudwatch_alarms_usprod_mar_2020.json jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1: .. | objects | select(contains({($sk): $sv})) .[$pv] jq: 1 compile error 我猜它显示语法错误 @oguz ismail
    • @theborngreek 是旧版本的 jq 吗?顺便更新一下答案,再试一次
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多