Ich habe eine JSON-Ausgabe, aus der ich unter Linux einige Parameter extrahieren muss.
Dies ist die JSON-Ausgabe:
{
"OwnerId": "121456789127",
"ReservationId": "r-48465168",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": null,
"RootDeviceType": "ebs",
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2014-03-19T09:16:56.000Z",
"PrivateIpAddress": "10.250.171.248",
"ProductCodes": [
{
"ProductCodeId": "aacglxeowvn5hy8sznltowyqe",
"ProductCodeType": "marketplace"
}
],
"VpcId": "vpc-86bab0e4",
"StateTransitionReason": null,
"InstanceId": "i-1234576",
"ImageId": "ami-b7f6c5de",
"PrivateDnsName": "ip-10-120-134-248.ec2.internal",
"KeyName": "Test_Virginia",
"SecurityGroups": [
{
"GroupName": "Test",
"GroupId": "sg-12345b"
}
],
"ClientToken": "VYeFw1395220615808",
"SubnetId": "subnet-12345314",
"InstanceType": "t1.micro",
"NetworkInterfaces": [
{
"Status": "in-use",
"SourceDestCheck": true,
"VpcId": "vpc-123456e4",
"Description": "Primary network interface",
"NetworkInterfaceId": "eni-3619f31d",
"PrivateIpAddresses": [
{
"Primary": true,
"PrivateIpAddress": "10.120.134.248"
}
],
"Attachment": {
"Status": "attached",
"DeviceIndex": 0,
"DeleteOnTermination": true,
"AttachmentId": "eni-attach-9210dee8",
"AttachTime": "2014-03-19T09:16:56.000Z"
},
"Groups": [
{
"GroupName": "Test",
"GroupId": "sg-123456cb"
}
],
"SubnetId": "subnet-31236514",
"OwnerId": "109030037527",
"PrivateIpAddress": "10.120.134.248"
}
],
"SourceDestCheck": true,
"Placement": {
"Tenancy": "default",
"GroupName": null,
"AvailabilityZone": "us-east-1c"
},
"Hypervisor": "xen",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": false,
"VolumeId": "vol-37ff097b",
"AttachTime": "2014-03-19T09:17:00.000Z"
}
}
],
"Architecture": "x86_64",
"KernelId": "aki-88aa75e1",
"RootDeviceName": "/dev/sda1",
"VirtualizationType": "paravirtual",
"Tags": [
{
"Value": "Server for testing RDS feature in us-east-1c AZ",
"Key": "Description"
},
{
"Value": "RDS_Machine (us-east-1c)",
"Key": "Name"
},
{
"Value": "1234",
"Key": "cost.centre",
},
{
"Value": "Jyoti Bhanot",
"Key": "Owner",
}
],
"AmiLaunchIndex": 0
}
]
}
Ich möchte eine Datei schreiben, die Überschriften wie Instanz-ID, Tag wie Name, Kostenstelle, Eigentümer enthält. und darunter bestimmte Werte aus der JSON-Ausgabe. Die hier angegebene Ausgabe ist nur ein Beispiel.
Wie kann ich das mit sed
und machen awk
?
Erwartete Ausgabe :
Instance id Name cost centre Owner
i-1234576 RDS_Machine (us-east-1c) 1234 Jyoti
text-processing
sed
awk
json
user3086014
quelle
quelle
Antworten:
Die Verfügbarkeit von Parsern in nahezu jeder Programmiersprache ist einer der Vorteile von JSON als Datenaustauschformat.
Anstatt zu versuchen, einen JSON-Parser zu implementieren, ist es wahrscheinlich besser, ein für JSON-Parsing entwickeltes Tool wie jq oder eine Allzweck-Skriptsprache mit einer JSON-Bibliothek zu verwenden.
Mit jq können Sie beispielsweise die ImageID wie folgt aus dem ersten Element des Instances-Arrays ziehen:
Alternativ können Sie dieselben Informationen auch mit Rubys JSON-Bibliothek abrufen:
Ich werde nicht alle Ihre überarbeiteten Fragen und Kommentare beantworten, aber das Folgende ist hoffentlich genug, um Ihnen den Einstieg zu erleichtern.
Angenommen, Sie hätten ein Ruby-Skript, das ein aus STDIN lesen und die zweite Zeile in Ihrer Beispielausgabe [0] ausgeben könnte. Das Skript könnte ungefähr so aussehen:
Wie könnten Sie ein solches Skript verwenden, um Ihr gesamtes Ziel zu erreichen? Angenommen, Sie hatten bereits Folgendes:
Eine Möglichkeit wäre, Ihre Shell zu verwenden, um diese Werkzeuge zu kombinieren:
Vielleicht haben Sie jetzt einen einzigen Befehl, der Ihnen einen JSON-Blob für alle Instanzen mit mehr Elementen in diesem "Instances" -Array gibt. Wenn dies der Fall ist, müssen Sie das Skript nur ein wenig ändern, um das Array zu durchlaufen, anstatt einfach das erste Element zu verwenden.
Am Ende ist der Weg, um dieses Problem zu lösen, der Weg, um viele Probleme in Unix zu lösen. Teilen Sie es in leichtere Probleme auf. Finden oder schreiben Sie Tools, um das einfachere Problem zu lösen. Kombinieren Sie diese Tools mit Ihrer Shell oder anderen Betriebssystemfunktionen.
[0] Beachte, dass ich keine Ahnung habe, woher du die Kostenstelle nimmst, also habe ich es einfach erfunden.
quelle
Sie können das folgende Python-Skript verwenden, um diese Daten zu analysieren. Nehmen wir an , dass Sie JSON - Daten aus Arrays in Dateien wie haben
array1.json
,array2.json
und so weiter.Und dann einfach laufen:
Ich habe keine Kosten in Ihren Daten gesehen, deshalb habe ich das nicht berücksichtigt.
Laut Diskussion in Kommentaren habe ich das Skript parse.py aktualisiert:
Sie können versuchen, folgenden Befehl auszuführen:
quelle
import json from pprint import pprint jdata = open('example.json') data = json.load(jdata) print "InstanceId", " - ", "Name", " - ", "Owner" print data["Instances"][0]["InstanceId"], " - " ,data["Instances"][0]["Tags"][1]["Value"], " - " ,data["Instances"][0]["Tags"][2]["Value"] jdata.close()
Wenn Sie alle json-Daten von Arrays in Dateien wie array1.json, array2.json usw. haben, können Sie versuchen, es so# for x in
auszuführen : ls * .json; do python parse.py $x; done
Der folgende JQ-Code:
verwendet wie:
würde ausgeben:
Ein paar Hinweise zum Verständnis des Codes:
from_entries
Nimmt ein Array von Objekten wie{key:a, value:b}
und verwandelt es in ein Objekt mit entsprechenden Schlüssel / Wert-Paaren ({a: b}
);Key
undValue
imTags
Array mussten in Kleinbuchstaben umgewandelt werden.Weitere Informationen finden Sie im jq-Tutorial und im Handbuch unter https://stedolan.github.io/jq/.
quelle
(.Tags | map({Value, Key}) | from_entries) as $tags
, ohne die Schlüssel in Kleinbuchstaben umzuwandeln.Andere haben allgemeine Antworten auf Ihre Frage gegeben, die gute Möglichkeiten zum Parsen von json aufzeigen. Ich suchte jedoch wie Sie nach einer Möglichkeit, eine aws-Instanz-ID mit einem Kerntool wie awk oder sed zu extrahieren, ohne von anderen Paketen abhängig zu sein. Um dies zu erreichen, können Sie das Argument "--output = text" an Ihren aws-Befehl übergeben, wodurch Sie eine parsable awk-Zeichenfolge erhalten. Damit können Sie einfach die Instanz-ID mit etwas wie dem folgenden erhalten ...
quelle
Jshon ist in verschiedenen Distributionen erhältlich:
Schlechte Erklärung:
-e uu
Objekt extrahierenuu
,-a
Array verwendbar machen (nicht sicher, ob ich dieses richtig formuliert habe, aber trotzdem ...),-u
String dekodieren,-p
zum vorherigen Element zurückkehren (-i N
N ist eine beliebige Zahl, scheint den gleichen Effekt zu haben) .Abhängig von Ihrem Fall kann die Ausgabe eine Nachbehandlung erfordern (wie Sie sehen können).
Jshon
scheint jedoch nicht robust gegen JSON-Missbildungen zu sein (Ihre "Tags" mit Kommas vor der schließenden geschweiften Klammer lösen einen Fehler aus).Jemand hat jsawk in einem anderen Thread erwähnt, aber ich habe es nicht getestet.
quelle
Wenn dies auf den oben angegebenen AWS-Anwendungsfall beschränkt ist, sollten Sie --query- und --output-Flags für Ihren CLI-API-Aufruf verwenden
http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html
quelle
Hier ist ein Einzeiler-Vorschlag:
Nicht perfekt, aber es würde funktionieren, wenn Sie es ein bisschen optimieren.
Grundsätzlich wird verwendet
pr
, um jedes eingestellte Ergebnis pro Spalte zu drucken. Jede Ergebnismenge wird durch eine Prozessersetzung zurückgegeben, die die JSON-Datei analysiert und Werte basierend auf dem Schlüssel zurückgibt.Dies funktioniert ähnlich wie in: Wie kann ich bei gegebenem Schlüsselwert-Inhalt Werte nach Schlüssel gruppieren und nach Wert sortieren?
quelle
Schauen Sie sich
jtc
cli tool an:Mit dieser Funktion können Sie auf einfache Weise die erforderlichen Informationen aus Ihrem
file.json
JSON-Code extrahieren (vorausgesetzt , der JSON-Code ist in , übrigens, muss repariert werden, es gibt ein paar zusätzliche Kommas):quelle
jq "." recovery.js | head -n 20
übersetzt Ihre Jason-Datei in etwas, das wie folgt gelesen werden kann:
Nun sollte es möglich sein, Ihre Daten mit beliebigen Standardwerkzeugen zu analysieren
quelle