ubuntuusers.de

jq

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

jq.png 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)

Paketliste zum Kopieren:

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.

Diese Revision wurde am 22. Oktober 2018 14:16 von Prof._Frink erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Programmierung, Shell