Wer kennt das nicht? Da bist Du am Irgendwas-Nerden und brauchst einen TOML-Zu-YAML-Konverter, weil Du keinen Bock hast, das von Hand zu machen aber der Zug ist grad im Tunnel.

Unschön. Aber da kann man was machen. Eine kurze Startpage-Suche fördert einen ganzen Schwung von Tools zutage, die man für die Offline-Konvertierung zwischen Toml, Yaml und Json nehmen kann.

Und wenn wir schon beim Thema sind: Für die Verarbeitung von Json/Yaml/Toml/Html (…) Dateien gibt’s inzwischen ein paar wirklich nützliche Werkzeuge, so dass man eigentlich keinen Parser mehr selber schreiben muss, es sei denn, man hat da Bock drauf.

Drei dieser Werkzeuge möchte ich hier mal vorstellen. Auch an Erinnerung an mich, dass es sie gibt. 😉

Json/Yaml/Toml Konverter: yj

Ja. Richtig gelesen. Heisst so. Yj ist ein in Go geschriebenes Kommandozeilen-Tool für den eingangs beschriebenen Fall, dass man kein Internet hat und eine Toml-Datei nach Yaml oder Json konvertieren muss. Oder andersrum in egal welcher Kombination.

Das Tool gibts auf Github und lässt sich auf Macos mit Homebrew installieren. Binaries für Windows und Linux gibts auch.

Die Anwendung ist (wenn man davon absieht, dass ein yj <Dateiname> nicht das tut, was man erwartet) simpel:

root@hugo:~# yj -h
Usage: yj [-][ytjcrneikhv]

Convert between YAML, TOML, JSON, and HCL.
Preserves map order.

-x[x]  Convert using stdin. Valid options:
          -yj, -y = YAML to JSON (default)
          -yy     = YAML to YAML
          -yt     = YAML to TOML
          -yc     = YAML to HCL
          -tj, -t = TOML to JSON
          -ty     = TOML to YAML
          -tt     = TOML to TOML
          -tc     = TOML to HCL
          -jj     = JSON to JSON
          -jy, -r = JSON to YAML
          -jt     = JSON to TOML
          -jc     = JSON to HCL
          -cy     = HCL to YAML
          -ct     = HCL to TOML
          -cj, -c = HCL to JSON
          -cc     = HCL to HCL
-n     Do not covert inf, -inf, and NaN to/from strings (YAML or TOML only)
-e     Escape HTML (JSON out only)
-i     Indent output (JSON or TOML out only)
-k     Attempt to parse keys as objects or numeric types (YAML out only)
-h     Show this help message
-v     Show version

Ganz einfaches Beispiel: Yaml Datei nach Json konvertieren und mit jq (kommt noch) parsen:

bob@linux:~/things$ cat sample.yml
---
 bar: open
 gin:
   - monkey
   - brockmans
   - boar
   - hendricks
bob@linux:~/things$ yj -y < sample.yml | jq -r .'gin[1]'
brockmans
bob@linux:~/things$

So richtig wertvoll wird’s natürlich erst, wenn die Eingabe ein wenig aufwändiger ist oder man Dinge automatisieren muss.

Natürlich kann man das alles “von Hand” machen, da reicht ein winziges Code-Fetzchen Python…

Filter für Json Dateien: jq

jq ist ein Kommandozeilen-Tool, das json Dateien verarbeitet. Damit kann man sehr effizient Daten aus json-Dateien rauskratzen. Ein kleines Beispiel: Wenn man in der cli wissen will, welche Policies man auf seinem Check Point Management hat, kann man das über API-Kommandos erledigen:

[Expert@mgmt:0]# mgmt_cli -r true show packages --format json
{
  "packages" : [ {
    "uid" : "2c60639d-110f-4f5d-a8a3-72d64f43e80f",
    "name" : "gw1_policy",
    "type" : "package",
    "domain" : {
      "uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde",
      "name" : "SMC User",
      "domain-type" : "domain"
    },
    "icon" : "Blades/Access",
    "color" : "black"
  }, {
    "uid" : "3bfddeee-b01b-421e-b04b-fb7be3a16c51",
    "name" : "Standard",
    "type" : "package",
    "domain" : {
      "uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde",
      "name" : "SMC User",
      "domain-type" : "domain"
    },
    "icon" : "Blades/Access",
    "color" : "black"
  } ],
  "from" : 1,
  "to" : 2,
  "total" : 2
}

Da kann man das jetzt als Mensch schon rauslesen und wenn man das (zum Beispiel in einem Skript) weiter verarbeiten möchte, kann man das mit grep, awk und tr auch erledigen:

[Expert@mgmt:0]# mgmt_cli -r true show packages --format json | grep -B 1 'package' | grep name | awk '{print $3}' | tr -d '"' | tr -d ','
gw1_policy
Standard

Echt viel zu schreiben. Wir sind faul. Genau dafür gibt’s jq:

[Expert@mgmt:0]# mgmt_cli -r true show packages --format json | jq -r .packages[].name
gw1_policy
Standard

Bäm.

Und das ist nur das einfachste aller Beispiele. Es gibt sehr mächtige Abfrage-Mechanismen, die jq bei der Arbeit mit json Daten zu einem extrem wertvollen Werkzeug machen.

Schaut euch die Doku auf der Projektseite bei Github an oder startet einfach mal mit einem Youtube-Video.

jq gibts in alles Linux-Distributionen die ich kenne als Paket.

Html-Parser: pup

Der Letzte in dieser Werkzeugschublade ist der HTML Prozessor pup. Seltsamer Name, aber nützliches Werkzeug. Damit kann man Daten aus einer HTML-Eingabe kratzen. Als Beispiel mal die Abfrage der aktuellen ReadyNAS Version (Betriebssystem für ein Netgear NAS):

root@linux:~#curl -s https://www.netgear.com/support/product/ReadyNAS_OS_6#download | pup ':contains("Software Version") json{}' | jq -r '.[0].text'
Software Version 6.10.8 (x86)

Ein sehr simples Beispiel, in dem nach einem Textmuster im gesamten Html-Dokument gesucht wird. Das geht aber auch wesentlich differenzierter. Die Github-Projektseite listet eine überschaubare aber nützliche Anzahl von Optionen, mit denen man alle möglichen Daten aus HTML-Seiten extrahieren kann.

Sehr nützlich, gerade in Verbindung mit der json-Ausgabe und jq.

Auch pup gibts bei vielen Distributionen als Paket.

Was pup macht, wäre mit bash- oder python-Mitteln genauso gut zu erledigen, aber das wäre unter Umständen deutlich mehr Schreibarbeit und würde (zumindest, wenn man das mit Shell-Kommandos macht) wahrscheinlich auch den einen oder anderen CPU-Takt mehr brauchen.