Estou usando o cliente AWS CLI para obter o status de um snapshot, mas a saída está em JSON. por exemplo.
{
"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": []
}
]
}
Eu posso usar uma combinação de grep
e sed
( | grep Status | sed 's/.*"Status": "//' | sed 's/",//'
) para isolar o status de "copiar", MAS eu queria saber se havia uma maneira mais fácil de analisar o JSON no bash. por exemplo.var['DBClusterSnapshots'][0]['Status']
Sim, existem várias ferramentas diferentes que possuem um analisador JSON completo e alguma forma de linguagem de consulta (na linha do XML com XPath).
jq -r .DBClusterSnapshots[0].Status
jshon -e DBClusterSnapshots -e 0 -e Status -u
Mas também nada o impede de escrever um script de uma linha em uma linguagem que tenha um analisador JSON integrado e produza os dados desejados:
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};'
As ferramentas da AWS CLI têm um parâmetro integrado
--query
que aceita uma expressão JMESPath para selecionar um subconjunto da saída JSON.Seu exemplo ficaria mais ou menos assim:
O comando acima pode produzir uma saída entre aspas como
"copying"
(com as aspas incluídas), porque as ferramentas da AWS CLI geram literais JSON por padrão.Se você quiser apenas o texto simples
copying
(sem aspas), adicione--output text
à linha de comando acima.