使用管道运算符在 Bash 中解析 JSON

使用管道运算符在 Bash 中解析 JSON

我正在使用AWS CLI 客户端获取快照的状态,但输出是 JSON。例如

{
    "DBClusterSnapshots": [
        {
            "AvailabilityZones": [
                "us-east-2a",
                "us-east-2b",
                "us-east-2c"
            ],
            "DBClusterSnapshotIdentifier": "...",
            "DBClusterIdentifier": "...",
            "SnapshotCreateTime": "2021-12-23T05:59:41.658000+00:00",
            "Engine": "aurora",
            "AllocatedStorage": 517,
            "Status": "copying",
            "Port": 0,
            "ClusterCreateTime": "2020-01-17T18:59:19.045000+00:00",
            "MasterUsername": "...",
            "EngineVersion": "5.6.mysql_aurora.1.22.1",
            "LicenseModel": "aurora",
            "SnapshotType": "manual",
            "PercentProgress": 0,
            "StorageEncrypted": true,
            "KmsKeyId": "...",
            "DBClusterSnapshotArn": "...",
            "SourceDBClusterSnapshotArn": "...",
            "IAMDatabaseAuthenticationEnabled": false,
            "TagList": []
        }
    ]
}

grep我可以使用和sed( )的组合| grep Status | sed 's/.*"Status": "//' | sed 's/",//'来隔离“复制”的状态,但我想知道是否有更简单的方法来解析 bash 中的 JSON。例如。var['DBClusterSnapshots'][0]['Status']

答案1

AWS CLI 工具具有内置--query参数接受JMESPath 表达式选择 JSON 输出的子集。

你的示例看起来可能会像这样:

aws rds describe-db-cluster-snapshots --query "DBClusterSnapshots[0].Status"

上述命令可能会产生类似的带引号的输出"copying"(包含引号),因为 AWS CLI 工具默认生成 JSON 文字。

如果您只想要裸文本copying(不带引号),请添加--output text到上面的命令行。

答案2

是的,有几种不同的工具具有完整的 JSON 解析器和某种形式的查询语言(类似于具有 XPath 的 XML)。

  • jq -r .DBClusterSnapshots[0].Status

  • jshon -e DBClusterSnapshots -e 0 -e Status -u

但也没有什么能阻止你用一种语言写一个单行脚本有一个内置的 JSON 解析器并输出所需的数据:

  • python -c "import sys, json; data = json.load(sys.stdin); print(data['DBClusterSnapshots'][0]['Status'])"

  • perl -MJSON -E '$/=undef; $data=decode_json(<>); say $data->{DBClusterSnapshots}->[0]->{Status};'

相关内容