我正在使用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']
是的,有几种不同的工具具有完整的 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};'
AWS CLI 工具有一个内置
--query
参数,该参数接受JMESPath 表达式来选择 JSON 输出的子集。您的示例将如下所示:
上述命令可能会产生
"copying"
带引号的输出(包括引号),因为 AWS CLI 工具默认生成 JSON 文字。如果您只想要纯文本
copying
(不带引号),请添加--output text
到上面的命令行。