ADMIN-Tipp: JSON auf der Commandline

Jede Woche erscheint in unserem Newsletter ein neuer ADMIN-Tipp. Eine Sammlung aller Tipps finden Sie im Archiv der ADMIN-Tipps.

Immer mehr Programme verwenden als Datenformat das Javascript-Objektformat JSON. Mit gängigen Unix-Tools ist es nicht so einfach zu verarbeiten, aber es gibt eine Lösung...

In der Java-Welt war lange Zeit XML das Datenformat der Wahl, aber mit seinen öffnenden und schließenden Tags und spitzen Klammern war es vielen Anwendern zu geräuschvoll. Seit Javascript an Popularität gewinnen konnte, gibt es auch in der Unix-Welt immer mehr Programme, die für Konfiguration, Datenaustausch und -speicherung auf die Javascript Object Notation JSON setzen. Ein Beispiel dafür ist SmartOS, das die Beschreibung von virtuellen Maschinen im JSON-Format erwartet und auch ausgibt. Das sieht dann etwa so aus:

{
  "brand":"kvm",
  "vcpus":1,
  "autoboot":false,
  "ram":1024,
  "resolvers": ["208.67.222.222","208.67.220.220"],
  "disks": [
    {
      "boot":true,
      "model":"virtio",
      "size":40960
    }
  ],
  "nics": [
    {
      "nic_tag":"admin",
      "model":"virtio",
      "ip":"10.88.88.51",
      "netmask":"255.255.255.0",
      "gateway":"10.88.88.1",
      "primary":1
    }
  ]
}

Sofern die Leerzeichen und Einrückungen erhalten sind, ist das sogar für Menschen leicht zu verstehen. Wie soll man aber auf der Kommandozeile derart strukturierte Dateien verarbeiten? Die Lösung ist ein kleines Tool namens JQ, das JSON-Dateien versteht und diverse Filter-Mechanismen bietet, um die Informationen darin auszulesen. Die Website bietet neben dem Quellcode auch Binaries für Linux, OS X, Solaris und Windows an, sodass die Installation komplett wegfällt. Bei Unix-Systemen muss man lediglich noch dem Binary mit "chmod +x" die nötigen Ausführungsrechte zuweisen. 

JQ liest eine Datei von der Standardeingabe und verarbeitet die Daten anhand eines Operators, den der Anwender auf der Kommandozeile angibt und der an die von XML bekannte Xpath-Syntax erinnert. Der einfachste Operator ist ein Punkt. Er bringt JQ dazu, die eingelesenen Daten zu ordnen und per Syntax Highlighting hervorzuheben:./jq '.' < vm.json Ist in den JSON-Daten ein Array verpackt, gibt der Operator '.[0]' das erste Element aus, '.[1]' das zweite, und so weiter. Mit einem JSON-Hashkey an den Punkt angehängt, gibt JQ das entsprechende Attribut aus:

./jq '.brand' < vm.json 
"kvm"

Das funktioniert analog, wenn die Objekte weiter verschachtelt sind. Etwas schwieriger ist es, wenn die Unterelemente wieder Arrays enthalten, etwa bei den Disks der obigen VM-Definition. Die Lösung dafür sieht so aus:

./jq '.disks[].model' < vm.json 
"virtio"

JQ bietet noch eine Menge weiterer Optionen, einschließlich logischer Bedingungen und Variablen, über die das Manual auf der Website mehr verrät. Bei längeren Ausdrücken kann der Anwender die Filter auch in eine Datei schreiben, statt sie direkt auf der Kommandozeile anzugeben. Auch bei der Ausgabe bietet JQ praktische Vielfalt: Neben dem JSON-Format bietet das Tool auch Text, HTML, CSV, Base64 und sogar ein spezielles Shell-Format an.

16.06.2014
comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019