Ich arbeite mit The AWS Command Line Interface for DynamoDB.Wie vereinfacht man AWS DynamoDB Abfrage JSON-Ausgabe von der Kommandozeile?
Wenn wir ein Element abfragen, erhalten wir eine sehr detaillierte JSON-Ausgabe. Sie erhalten so etwas wie diese (es von den get-item
gebaut, um wurde fast auf Vollständigkeit (der NULL
Typ weggelassen wurde) aws command line help:
{
"Count": 1,
"Items": [
{
"Id": {
"S": "app1"
},
"Parameters": {
"M": {
"nfs": {
"M": {
"IP" : {
"S" : "172.16.0.178"
},
"defaultPath": {
"S": "/mnt/ebs/"
},
"key": {
"B": "dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk"
},
"activated": {
"BOOL": true
}
}
},
"ws" : {
"M" : {
"number" : {
"N" : "5"
},
"values" : {
"L" : [
{ "S" : "12253456346346"},
{ "S" : "23452353463464"},
{ "S" : "23523453461232"},
{ "S" : "34645745675675"},
{ "S" : "46456745757575"}
]
}
}
}
}
},
"Oldtypes": {
"typeSS" : {"SS" : ["foo", "bar", "baz"]},
"typeNS" : {"NS" : ["0", "1", "2", "3", "4", "5"]},
"typeBS" : {"BS" : ["VGVybWluYXRvcgo=", "VGVybWluYXRvciAyOiBKdWRnbWVudCBEYXkK", "VGVybWluYXRvciAzOiBSaXNlIG9mIHRoZSBNYWNoaW5lcwo=", "VGVybWluYXRvciA0OiBTYWx2YXRpb24K","VGVybWluYXRvciA1OiBHZW5lc2lzCg=="]}
}
}
],
"ScannedCount": 1,
"ConsumedCapacity": null
}
Gibt es eine Möglichkeit, eine einfachere Ausgabe für den Items
Teil zu bekommen? wie folgt aus:..
{
"ConsumedCapacity": null,
"Count": 1,
"Items": [
{
"Id": "app1",
"Parameters": {
"nfs": {
"IP": "172.16.0.178",
"activated": true,
"defaultPath": "/mnt/ebs/",
"key": "dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk"
},
"ws": {
"number": 5,
"values": ["12253456346346","23452353463464","23523453461232","34645745675675","46456745757575"]
}
},
"Oldtypes": {
"typeBS": ["VGVybWluYXRvcgo=", "VGVybWluYXRvciAyOiBKdWRnbWVudCBEYXkK", "VGVybWluYXRvciAzOiBSaXNlIG9mIHRoZSBNYWNoaW5lcwo=", "VGVybWluYXRvciA0OiBTYWx2YXRpb24K", "VGVybWluYXRvciA1OiBHZW5lc2lzCg=="],
"typeNS": [0, 1, 2, 3, 4, 5],
"typeSS": ["foo","bar","baz"]
}
}
],
"ScannedCount": 1
}
Es gibt nichts, hilfreich bei der dynamodb - AWS CLI 1.7.10 documentation
Wir müssen das Ergebnis von der Kommandozeile bekommen ich bin bereit, andere Kommandozeilen-Tools li verwenden ke jq
wenn nötig, aber eine solche jq
Zuordnung scheint mir kompliziert.
Update 1: jq
basierte Lösung (mit Hilfe von DanielH Antwort)
Mit jq
es ist einfach, aber nicht ganz hübsch, man kann so etwas tun:
$> aws dynamodb query --table-name ConfigCatalog --key-conditions '{ "Id" : {"AttributeValueList": [{"S":"app1"}], "ComparisonOperator": "EQ"}}' | jq -r '.Items[0].Parameters.M."nfs#IP".S'
Ergebnis wird sein: 172.16.0.178
Die jq
-r
option gi Sie erhalten eine rohe Ausgabe.
Update 2: jq
basierte Lösung (mit Hilfe von @ jeff-mercado)
Hier ist eine aktualisierte und kommentierte Version von Jeff Mercado jq
Funktion DynamoDB Ausgabe entordnen. Es wird Ihnen die erwartete Ausgabe:
$> jq -f unmarshal_dynamodb.jq ddb-query-result.json
Hmm, so ist es, dass die Schlüsselnamen ihre Typen zeigen Objekt? Wie steht "S" für Strings, "M" für Maps und "N" für Zahlen? Sie können tatsächlich etwas wirklich schönes damit machen. –
Ihre 'unmarshal_dynamodb.jq' Lösung ist brilliant und der Kredit geht an Sie & @JeffMercado. Ein Fehler bei der Verwendung der '//', die ich zu lösen versucht habe, ist, dass jeder Filter, der false zurückgibt, nicht transformiert wird. Dies ist wichtig bei booleschen Werten, die tatsächlich auf "false" gesetzt sind - sie behalten die "BOOL" - oder "B" -Taste bei. Ich habe eine Zeile hinzugefügt, um dieses Problem teilweise zu lösen, habe aber noch keinen Weg gefunden, um es ohne einen zweiten Durchlauf vollständig zu reparieren: '// (Objekte | wenn hat ("BOOL") oder hat ("B") dann [false] else null end) ' Dies fügt 'false' als 1-Element-Array hinzu und muss vor der Zeile" # managing others ... "stehen. –
@DaveStern: Ich habe die hier verwendete Methode überarbeitet, um Falschwerte richtig zu behandeln. Und sollte jetzt eine insgesamt sauberere Implementierung haben. –