jq
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 18.04 Bionic Beaver
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
jq 🇬🇧 ist ein Kommandozeilen-Programm, mit dem auf einen Stream von JSON-Daten verschiedene Filter angewandt werden können. Auf diese Weise können gewünschte Daten aus dem JSON-Stream extrahiert werden. Es können verschiedene Filter über Pipes miteinander verbunden werden.
Installation¶
jq kann direkt aus den Quellen installiert werden [1].
jq (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install jq
Oder mit apturl installieren, Link: apt://jq
Das Programm kann dann sofort gestartet werden.
Benutzung¶
Die allgemeine Syntax von jq lautet:
jq [OPTIONEN] <JQ FILTER> [DATEIEN]
Wird kein DATEI
angegeben, liest das Programm von der Standardeingabe.
Optionen¶
Das Programm kennt unter anderem die folgenden Optionen:
Auswahl von Optionen | |
Option | Beschreibung |
-c | kompakte (einzeilige) Ausgabe |
-n | Eingabewert 'nul', nützlich um JSON-Dateien zu generieren. |
-s | Liest den Eingabestream in einen Array. |
-r | "raw" Ausgabe (keine Anführungszeichen um strings) |
-R | "raw" Eingabe (jede Zeile wird als string übergeben) |
Weitere Optionen kann man in der Manpage nachlesen.
Filter¶
Beispiel¶
Im Folgenden wird angenommen, dass die Datei "simpsons.json" folgenden Inhalt hat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [ { "Name": "Homer Simpson", "Alter": 39, "Kinder": ["Bart","Lisa","Maggie"], "Jobs": ["techinscher Überwacher im KKW","Astronaut","Fett-Verkäufer"], "Hobbies": ["Bowling","Angeln"], "Freunde": ["Carl", "Lenny", "Moe"] }, { "Name": "Marge Simpson", "Alter": 34, "Kinder": ["Bart","Lisa","Maggie"], "Jobs": ["Hausfrau","KKW Angestellte","Polizistin","Telefonseelsorgerin"], "Hobbies": ["Malen","Zeichnen"] } ] |
Einfache Filter¶
Der einfachste Filter ist die Identität ".", bei welcher Input und Output identisch sind (abgesehen von der Formatierung).
jq "." simpsons.json
gibt den Inhalt der Datei formatiert aus.
Bei der Beispiel-Datei handelt es sich um einen Array von Daten, auf Arrays kann mit dem "[]" Operator zugegriffen werden, so gibt
jq ".[0]" simpsons.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | { "Name": "Homer Simpson", "Alter": 39, "Kinder": [ "Bart", "Lisa", "Maggie" ], "Jobs": [ "techinscher Überwacher im KKW", "Astronaut", "Fett-Verkäufer" ], "Hobbies": [ "Bowling", "Angeln" ], "Freunde": [ "Carl", "Lenny", "Moe", ] } |
das Objekt mit "Name" "Homer Simpsons" zurück.
Der Filter ".[]" gibt alle Objekte des Arrays zurück. Werden diese weiter gefiltert
jq ".[].Name" simpsons.json
erhält man beispielsweise alle Namen der Objekte der Liste:
"Homer Simpson" "Marge Simpson"
Will man diese zu einer neuen Liste verknüpfen, geht dies mit "[.[].Name]":
jq "[.[].Name]" simpsons.json
1 2 3 4 | [ "Homer Simpson", "Marge Simpson" ] |
Mit dem Pipe-Operator "|" können verschiedene Filter verknüpft werde, der vorherige Filter kann auch als "[.[]|.Name]" geschrieben werden.
Komplexere Filter¶
Der Additionsoperator "+" kann auf Zahlen (normale Addition), Strings (werden aneinander gehangen) , Arrays und Objekte angewendet werden. Beispielsweise liefert
jq ".[0]+.[1]" simpsons.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | { "Name": "Marge Simpson", "Alter": 34, "Kinder": [ "Bart", "Lisa", "Maggie" ], "Jobs": [ "Hausfrau", "KKW Angestellte", "Polizistin", "Telefonseelsorgerin" ], "Hobbies": [ "Malen", "Zeichnen" ], "Freunde": [ "Carl", "Lenny", "Moe" ] } |
ein Objekt, mit den Werten von Marge und den Freunden von Homer (weil bei gleichen Werten der rechts vom Plus-Zeichen genommen wird).
jq ".[0].Jobs+.[1].Jobs" simpsons.json
1 2 3 4 5 6 7 8 9 | [ "techinscher Überwacher im KKW", "Astronaut", "Fett-Verkäufer", "Hausfrau", "KKW Angestellte", "Polizistin", "Telefonseelsorgerin" ] |
liefert eine Liste mit den Jobs von Homer und Marge.
Der select-Filter "select(foo)" reicht seinen Input für die Fälle durch, in denen "foo" wahr ist, zum Beispiel gibt
jq ".[]|select(.Name==\"Marge Simpson\")" simpsons.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | { "Name": "Marge Simpson", "Alter": 34, "Kinder": [ "Bart", "Lisa", "Maggie" ], "Jobs": [ "Hausfrau", "KKW Angestellte", "Polizistin", "Telefonseelsorgerin" ], "Hobbies": [ "Malen", "Zeichnen" ] } |
das Objekt von "Marge Simpson" zurück, ohne dass der Index angegeben werden muss. Die Kombination mit dem "contains()"-Filter ist ebenso nützlich
jq ".[].Jobs|.[]|select(contains(\"KKW\"))" simpsons.json
"techinscher Überwacher im KKW" "KKW Angestellte"
Dieser Filter gibt alle Jobs zurück, die den String "KKW" enthalten.
Mit dem "match()" filter können reguläre Ausdrücke gesucht werden, beispielsweise liefert
jq ".[].Kinder|.[]|match(\"^....$\")" simpsons.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | { "offset": 0, "length": 4, "string": "Bart", "captures": [] } { "offset": 0, "length": 4, "string": "Lisa", "captures": [] } { "offset": 0, "length": 4, "string": "Bart", "captures": [] } { "offset": 0, "length": 4, "string": "Lisa", "captures": [] } |
alle Kinder mit einer Namenslänge von vier Buchstaben, sowie zusätzliche Informationen.
jq ist mit sehr vielen weiteren Filtern ausgestattet, über die man sich auf der manual-page 🇬🇧 des Projektes informieren kann.
Links¶
jq-manual 🇬🇧