- Die nicht mehr unterstützte Option
--argfilesowie die Filterleaf_pathsundrecurse_downwurden entfernt - Das Docker-Image wird nicht mehr über Docker Hub, sondern über
ghcr.io/jqlang/jqbereitgestellt - Für Release-Builds werden mehrere Architekturen für Linux, macOS, Windows und Docker angegeben
--raw-output0wurde hinzugefügt, sodass zwischen Ausgaben NUL-Bytes eingefügt werden können; die Ausgabe von Zeichenketten, die NUL enthalten, wird als Fehler behandelt- Unter Windows wurde die Option
--binary/-bhinzugefügt, um Zeilenenden mit\nstatt\r\nauszugeben - Mit
JQ_COLORSlässt sich die Farbe von Objektschlüsseln festlegen, und die UmgebungsvariableNO_COLORwird beachtet, um Farbausgabe zu deaktivieren - Das Problem mit dem Exit-Code der Option
--exit-code/-ewurde behoben: Wenn der letzte Ausgabewert wahr ist, wird 0 zurückgegeben, beifalseodernull1, und wenn es keine Ausgabe gibt, 4 - Zur Bewahrung der Präzision numerischer Literale werden dezimale Zahlenliterale verwendet; Vergleichsoperatoren respektieren die Präzision, arithmetische Operationen können sie jedoch abschneiden
- Neue eingebaute Funktionen
pick(stream),debug(msgs),scan($re; $flags)undabswurden hinzugefügt - In
if-Anweisungen kann derelse-Zweig weggelassen werden; ein ausgelasseneselsewird als Verhalten von.behandelt haltundhalt_errorwurden so geändert, dass sie nicht mit der nächsten Eingabe fortfahren, sondern sofort beendet werden- Probleme wurden behoben, bei denen die Darstellung großer Zahlen auf einigen Plattformen fehlerhafte JSON-Ausgaben erzeugte, es bei der Nutzung von libjq mit Threads zu Segmentation Faults kam und
--jsonargeinen Assert-Crash auslöste - CI, Scan-Builds, Releases und Website-Builds wurden auf GitHub Actions umgestellt, außerdem wurde OSS-Fuzz hinzugefügt
1 Kommentare
Hacker-News-Meinungen
JQ ist großartig, ich mag es wirklich sehr.
In unserem Produkt (einem JVM- und browserbasierten Kafka-Tool) haben wir eine Teilmenge von JQ in Clojure implementiert, damit Nutzer Daten transformieren/filtern können. Das war eine der spaßigsten Aufgaben, für die ich je Code geschrieben habe, und da ich generell gern Syntax schreibe, auch ein großes Dankeschön an Instaparse: https://github.com/Engelberg/instaparse
Bei der Implementierung habe ich erfahren, dass JQ LISP-2 ist, was mich überrascht hat, weil es sich allein an der Syntax nicht so anfühlt: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...
Aber mich stören die nicht intuitive Query-Syntax, dass man für winzigste Schritte nachschlagen muss, und dass das Ergebnis wie ein Zauberspruch aussieht, den niemand außer jq-Experten entschlüsseln kann. Gegen DSLs, die wie bei htmx oder Tailwind in Strings eingebettet sind, habe ich generell eine instinktive Abneigung.
Trotzdem erkenne ich an, dass es gut gemachte Software ist und es manchmal keine bessere Option gibt. Wenn man JSON in Bash verarbeitet, ist es im Vergleich zu sed/awk/cut-Monstern auch die am wenigsten schlechte Option. Trotzdem gehören jq-Befehle, die mitten im Script immer wie unentschlüsselbare Strings stehen, zusammen mit regulären Ausdrücken zu den Dingen, die ich in Code lieber nicht sehen möchte. Als Alternative habe ich auch schon Inline-Python in einem heredoc per Pipe übergeben, aber das wird genauso unordentlich wie jq-Scripts.
Wenn man in den Beispielen „Jq parser (partially working)“ auswählt und auf „Parse“ klickt, sieht man den Parser-Baum für den Quelltext unter „Input source“. Feedback ist jederzeit willkommen.
jq macht die meisten Fälle einfach (im Grunde JSON-Punktnotation) und ermöglicht zugleich die komplexen Fälle im Long Tail.
Ich mag jq, nutze aber auch JMESPath (besonders zusammen mit der AWS CLI), yq (einschließlich tomlq und xq) und dasel. Schade, dass hclq praktisch tot ist.
https://jmespath.org/
https://kislyuk.github.io/yq/
https://github.com/TomWright/dasel
https://hclq.sh/
Ich benutze
jqseit Jahren und bekomme das, was ich brauche, irgendwie immer zusammengebaut, aber intuitiv hat es sich für mich noch nie angefühlt. Sobald es nur ein wenig komplexer wird, kommt man ohne längeres Lesen der Dokumentation kaum zur Lösung; ich wünschte, es wäre einfacher zu benutzen.Sie hat mir geholfen, als ich die Syntax erstmals gelernt habe, und ich schaue auch heute noch dort nach, wenn ich über seltsame Syntax stolpere.
Der wichtigste Anwendungsfall ist, Dinge wie CSV, TOML und XML in JSON zu konvertieren, um sie dann an jq zu pipen: https://github.com/sentriz/rsl
https://github.com/kellyjonbrazil/jello
https://github.com/wwkimball/yamlpath
Es ist von XPath inspiriert und fühlt sich vertrauter an als eine völlig neue DSL; die Kernfunktion ist aus meiner Sicht die rekursive Schlüsselabfrage. Schreibt man
people..address, findet es überall im JSON alleaddress-Schlüssel unterhalb von „people“. Es ist meine Lieblings-Parsing-Sprache für JSON, und ich habe auch einen Artikel darüber geschrieben, wie man sie zum Parsen von JSON-Datensätzen nutzt.https://github.com/JSONPath-Plus/JSONPath
https://scrapfly.io/blog/parse-json-jsonpath-python/
Wenn man jq nur gelegentlich nutzt und jedes Mal in die Doku schauen muss, lohnt sich ein Blick auf gron. Es ist grep-fähiges JSON.
https://github.com/tomnomnom/gron
Ich nutze seit Jahren
curl cheat.sh/jqund halte cheat.sh insgesamt für eine hervorragende Ressource. Heutzutage würde ich vermutlich so etwas wie ChatGPT verwenden.Dinge wie
gron | grep | sed | gron -usind ebenfalls möglich.Einer der Gründe, warum ich jq mag oder zumindest tolerieren kann, ist seine Stabilität. Skripte, die ich vor Jahren geschrieben habe, funktionieren heute noch genauso.
Code, den ich dagegen für yq liegen hatte, ist häufig kaputtgegangen, weil yq sich ständig auf nicht abwärtskompatible Weise verbessert hat. Ich habe nicht untersucht, wie oft es solche Änderungen gab, war aber mehrfach betroffen, etwa bei CI-Skripten, wo die Versionen der Basis-Tools unterschiedlich sind und Updates in unterschiedlichem Tempo passieren.
Deshalb war ich den jq-Maintainern immer dankbar, dass sie die Bedeutung von Abwärtskompatibilität verstanden haben. Ich hoffe, diese Ankündigung bedeutet nicht, dass diese Stabilität nur ein zufälliges Nebenprodukt von Stillstand war und dass beim Beheben dieses Stillstands die Stabilität geopfert wird.
https://kislyuk.github.io/yq/
https://github.com/kyle-long/yq#yq
https://github.com/up1/yq-1#yq-command-line-yamlxml-processo...
https://github.com/onixspot/yq-2#yq-command-line-yamlxmltoml...
https://github.com/simonrupf/convert2json#convert2json
Zusätzlich zu jq-ähnlichen Tools gibt es mit jo und jc interessante Werkzeuge, die man zusammen mit jq nutzt.
https://github.com/jpmens/jo
https://github.com/kellyjonbrazil/jc
Von gron habe ich hier zum ersten Mal gehört, füge es aber der Vollständigkeit halber hinzu. Gleichzeitig scheint JSON so etwas wie das Standardausgabeformat für CLI-Tools zu werden. Idealerweise würden alle CLI-Tools ein Flag wie
--jsonanbieten, sodass jc nicht mehr nötig wäre.https://jless.io/
https://github.com/tomnomnom/gron
Verwandter Beitrag vom letzten Monat, „First release of jq in 5 years“: https://news.ycombinator.com/item?id=36951830
Ich bin ein großer jq-Fan und nutze es ständig.
Endlich ist es so weit.
Es ist wirklich großartig, wie die Community zusammengekommen ist, neue Maintainer rekrutiert und das Projekt wiederbelebt hat. Besonderer Dank gilt, nach GitHub-Benutzernamen, @stedolan, @itchyny und @owenthereal.
jq und miller gehören zusammen mit awk und vim zu den unverzichtbaren Dingen in meinem Werkzeugkasten.
https://github.com/johnkerl/miller
Die neue eingebaute Funktion
pick(stream)gibt eine Projektion des Eingabeobjekts oder -arrays aus.jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'Das ist wirklich eine rettende Funktion. Danke an die Beitragenden.
$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'{"a": 1,"e": 4}pick, die auch mit Streaming-Daten funktioniert, wäre daher schön.jaq möchte ich ebenfalls empfehlen. Es ist ein jq-Klon mit Fokus auf Korrektheit, Geschwindigkeit und Einfachheit.
Es implementiert nur eine Teilmenge von jq, aber bisher nutze ich es ziemlich zufrieden: https://github.com/01mf02/jaq