Aller au contenu

jq

À quoi il sert

jq, écrit en C portable, lit du JSON et lui applique un filtre : .version extrait un champ, .instances[] | .nom parcourt une liste, select(.etat == "ok") trie, {nom, ip: .adresse} reconstruit un objet. C'est l'outil qui manque au shell pour les données structurées : la réponse d'une API, la sortie --output json de scw, kubectl ou aws, un fichier de configuration. L'option -r sort des chaînes brutes, une par ligne, que mapfile ou while read reprennent dans Bash ; -e donne un code de sortie non nul quand le résultat est null ou false ; --arg et --argjson passent des valeurs du shell au filtre sans les coller dans son texte. Ubuntu 24.04 et Debian 13 fournissent la version 1.7.1.

Quand le choisir

Dès qu'un script shell doit lire ou produire du JSON : le découper avec grep, sed ou cut casse au premier changement d'indentation ou d'ordre des champs. Quand la transformation devient un programme à part entière (plusieurs sources, logique conditionnelle, calculs), Python et son module json sont plus lisibles. Pour du YAML, yq reprend une syntaxe proche.

Points d'attention

  • Ne construisez jamais un filtre en collant une variable du shell dans son texte (jq ".[] | select(.nom == \"$nom\")") : une valeur contenant un guillemet casse ou détourne le filtre. Passez-la par --arg nom "$nom" et écrivez $nom dans le filtre.
  • Sans -e, jq renvoie 0 même quand le champ demandé n'existe pas (il affiche null) : un script qui teste le code de sortie ne voit pas l'absence.
  • -r est indispensable pour récupérer une chaîne sans ses guillemets JSON ; sans lui, "1.4.0" garde ses guillemets dans la variable.
  • Les nombres sont des flottants double précision : un identifiant entier très long peut perdre des chiffres. jq 1.7 conserve le littéral d'origine tant qu'aucun calcul ne le touche, mais mieux vaut transporter ces identifiants comme des chaînes.

Par où commencer

La leçon Tableaux indexés et associatifs du cours Bash pour l'automatisation, qui montre où s'arrêtent les tableaux de Bash et quand passer à jq, et la leçon Boucles et lecture de données pour relire sa sortie ligne à ligne. Puis le manuel de jq 1.7 et son bac à sable en ligne.