Aller au contenu
Administration Linux medium

Maitriser la commande jq de A à Z

17 min de lecture

jq est un outil en ligne de commande conçu pour lire, filtrer, transformer et manipuler des données au format JSON. Dans un monde où les APIs et les fichiers de configuration s’appuient massivement sur ce format, jq devient indispensable pour tout administrateur système ou développeur DevOps.

Son principal avantage ? Permettre des requêtes complexes sur des structures de données imbriquées, directement depuis un terminal, sans avoir à écrire de script en Python ou en JavaScript.

Pour illustrer chaque commande jq de manière concrète, nous allons utiliser l’API publique JSONPlaceholder. C’est une API gratuite qui simule les fonctionnalités d’un service REST, idéale pour s’exercer sans avoir à configurer un backend.

Pourquoi cette API ?

  • Elle retourne des données JSON réalistes : utilisateurs, articles, commentaires, etc.
  • Elle est accessible sans authentification.
  • Les réponses sont structurées de manière cohérente, parfaites pour apprendre à manipuler des objets et tableaux JSON.

Nous nous appuierons notamment sur ces deux points d’entrée :

  • https://jsonplaceholder.typicode.com/users : pour manipuler une liste d’utilisateurs.
  • https://jsonplaceholder.typicode.com/posts : pour travailler avec des publications et filtrer les contenus.

Toutes les requêtes seront faites avec curl et traitées avec jq, directement en ligne de commande. Ainsi, tu pourras reproduire chaque commande sur ton propre terminal, sans installation complexe.

jq s’utilise principalement de deux façons : en lisant un fichier JSON ou en traitant un flux de données en entrée standard (stdin). Ces deux méthodes sont interchangeables selon le contexte.

La syntaxe classique consiste à passer un fichier JSON en argument :

Fenêtre de terminal
jq '.' fichier.json

Ici, le filtre . signifie “affiche tout”. Cette commande affiche le contenu JSON avec une indentation propre, ce qui facilite la lecture.

jq peut également lire directement depuis un flux, comme celui produit par une commande curl :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.'
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
...
]

Dans ce cas, jq reçoit les données JSON via le pipe |, les interprète et les formate à l’écran.

Avec jq, tu peux extraire précisément les éléments qui t’intéressent dans une structure JSON. Voici comment faire à partir de l’API JSONPlaceholder, qui renvoie une liste d’utilisateurs.

Affichons tous les noms des utilisateurs :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[].name'
"Leanne Graham"
"Ervin Howell"
"Clementine Bauch"
"Patricia Lebsack"
"Chelsey Dietrich"
"Mrs. Dennis Schulist"
"Kurtis Weissnat"
"Nicholas Runolfsdottir V"
"Glenna Reichert"
"Clementina DuBuque"

Le filtre .[].name signifie : “dans chaque élément du tableau principal, affiche la clé name”.

Pour chaque utilisateur, on peut extraire plusieurs informations à la fois :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | {id: .id, nom: .name, email: .email}'
{
"id": 1,
"nom": "Leanne Graham",
"email": "Sincere@april.biz"
}
{
"id": 2,
"nom": "Ervin Howell",
"email": "Shanna@melissa.tv"
}
{
"id": 3,
"nom": "Clementine Bauch",
"email": "Nathan@yesenia.net"
}
{
"id": 4,
"nom": "Patricia Lebsack",
"email": "Julianne.OConner@kory.org"
}
{
"id": 5,
"nom": "Chelsey Dietrich",
"email": "Lucio_Hettinger@annie.ca"
}
{
"id": 6,
"nom": "Mrs. Dennis Schulist",
"email": "Karley_Dach@jasper.info"
}
{
"id": 7,
"nom": "Kurtis Weissnat",
"email": "Telly.Hoeger@billy.biz"
}
{
"id": 8,
"nom": "Nicholas Runolfsdottir V",
"email": "Sherwood@rosamond.me"
}
{
"id": 9,
"nom": "Glenna Reichert",
"email": "Chaim_McDermott@dana.io"
}
{
"id": 10,
"nom": "Clementina DuBuque",
"email": "Rey.Padberg@karina.biz"
}

Voici ce que fait en détail la commande :

  1. curl -s https://jsonplaceholder.typicode.com/users Cette commande envoie une requête HTTP GET à l’API JSONPlaceholder. Le drapeau -s signifie “silent”, donc curl n’affiche pas la barre de progression. Le résultat est un tableau JSON contenant 10 utilisateurs.

  2. jq '.[]' Ce filtre dit à jq : “Parcours chaque élément du tableau”. Cela signifie que jq va traiter chaque utilisateur un par un.

  3. | {id: .id, nom: .name, email: .email} Pour chaque utilisateur, jq crée un nouvel objet JSON composé uniquement de trois clés :

    • id → la valeur du champ .id (identifiant de l’utilisateur)
    • nom → la valeur du champ .name
    • email → la valeur du champ .email

Ce type de transformation est parfait pour simplifier l’affichage, extraire des données ciblées, ou préparer une exportation vers un autre outil.

Affichons le nom et la ville de chaque utilisateur :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | {nom: .name, ville: .address.city}'
{
"nom": "Leanne Graham",
"ville": "Gwenborough"
}
{
"nom": "Ervin Howell",
"ville": "Wisokyburgh"
}
{
"nom": "Clementine Bauch",
"ville": "McKenziehaven"
}
{
"nom": "Patricia Lebsack",
"ville": "South Elvis"
}
{
"nom": "Chelsey Dietrich",
"ville": "Roscoeview"
}
{
"nom": "Mrs. Dennis Schulist",
"ville": "South Christy"
}
{
"nom": "Kurtis Weissnat",
"ville": "Howemouth"
}
{
"nom": "Nicholas Runolfsdottir V",
"ville": "Aliyaview"
}
{
"nom": "Glenna Reichert",
"ville": "Bartholomebury"
}
{
"nom": "Clementina DuBuque",
"ville": "Lebsackbury"
}

.address.city permet d’accéder à une propriété imbriquée dans un objet "address".

Pour obtenir les données du 3e utilisateur :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[2]'
{
"id": 3,
"name": "Clementine Bauch",
"username": "Samantha",
"email": "Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite 847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"geo": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
"phone": "1-463-123-4447",
"website": "ramiro.info",
"company": {
"name": "Romaguera-Jacobson",
"catchPhrase": "Face to face bifurcated interface",
"bs": "e-enable strategic applications"
}
}

Les tableaux JSON commencent à l’index 0. .[2] cible donc le 3e élément.

Extraire uniquement l’email du 5e utilisateur :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[4].email'

Tu peux combiner les index avec les noms de clés pour naviguer dans la structure.

Si un champ contient un caractère spécial, utilise les guillemets doubles et l’opérateur . :

Fenêtre de terminal
jq '."nom-du-champ"' fichier.json

Même si ce cas ne se produit pas dans JSONPlaceholder, il est bon à connaître pour d’autres API.

Le point d’entrée https://jsonplaceholder.typicode.com/users retourne une liste de 10 utilisateurs, chacun avec des champs comme id, name, email, et un objet address contenant city, zipcode, etc. Voici comment transformer ces données avec jq.

Filtrons les utilisateurs vivant dans la ville de “McKenziehaven” :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | select(.address.city == "McKenziehaven")'

Le filtre select(.address.city == "McKenziehaven") affiche uniquement les utilisateurs correspondant à ce critère.

Retirons les adresses complètes des utilisateurs :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | del(.address)'

Cette commande supprime le champ address de chaque objet utilisateur.

Construisons une vue simplifiée avec des noms de champs personnalisés :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | {identifiant: .id, nom: .name, ville: .address.city}'

Ici, on crée un nouvel objet avec des clés renommées et un sous-champ extrait.

Ajoutons une clé statut à tous les utilisateurs :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | . + {statut: "actif"}'

Chaque objet utilisateur contient maintenant une clé statut avec la valeur "actif".

Pour obtenir le total d’entrées dans la réponse JSON :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq 'length'

Le filtre length compte les objets du tableau.

Récupérons une liste des emails :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq 'map(.email)'

Ce filtre renvoie un tableau contenant uniquement les adresses email des utilisateurs.

Une fois les bases maîtrisées, jq permet d’aller beaucoup plus loin grâce à des filtres avancés, des combinaisons logiques, et des fonctions intégrées. Voici quelques usages puissants, toujours avec le point d’entrée https://jsonplaceholder.typicode.com/users.

Filtrons les utilisateurs dont l’ID est supérieur à 5 et vivant dans la ville de “Howemouth” :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | select(.id > 5 and .address.city == "Howemouth")'

Avec and, jq évalue plusieurs conditions sur un même objet. On peut aussi utiliser or :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | select(.id < 3 or .address.city == "Lebsackbury")'

Appliquer une fonction à une chaîne ou un nombre

Section intitulée « Appliquer une fonction à une chaîne ou un nombre »

Obtenir tous les noms en majuscules :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | {nom_majuscule: (.name | ascii_upcase)}'

Ici, ascii_upcase convertit la valeur de .name en majuscules.

Trouver les utilisateurs dont le nom contient “Glen” :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | select(.name | contains("Glen"))'

contains est sensible à la casse. Pour ignorer la casse, on peut combiner avec ascii_downcase :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | select((.name | ascii_downcase) | contains("glen"))'

On peut trier les utilisateurs par nom :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq 'sort_by(.name)[] | {id, nom: .name}'

sort_by(.name) trie le tableau par ordre alphabétique selon .name.

jq propose une riche collection de fonctions intégrées pour manipuler des données JSON en ligne de commande. Ces fonctions couvrent des opérations sur les chaînes, les tableaux, les objets, les nombres, les types, et bien plus encore. Voici un aperçu des principales catégories de fonctions disponibles :

  • length : Renvoie la longueur d’une chaîne.
  • ascii_upcase / ascii_downcase : Convertit une chaîne en majuscules ou minuscules.
  • split / join : Divise une chaîne en tableau ou joint un tableau en chaîne.
  • startswith / endswith : Vérifie si une chaîne commence ou se termine par une sous-chaîne donnée.
  • contains : Vérifie si une chaîne contient une sous-chaîne spécifique.
  • map : Applique une transformation à chaque élément d’un tableau.
  • select : Filtre les éléments d’un tableau selon une condition.
  • add : Additionne les éléments d’un tableau numérique.
  • sort / sort_by : Trie les éléments d’un tableau.
  • unique / unique_by : Supprime les doublons dans un tableau.
  • reverse : Inverse l’ordre des éléments d’un tableau.
  • keys : Renvoie les clés d’un objet.
  • has : Vérifie la présence d’une clé dans un objet.
  • del : Supprime une clé d’un objet.
  • to_entries / from_entries : Convertit un objet en tableau de paires clé/valeur et inversement.
  • with_entries : Transforme les paires clé/valeur d’un objet
  • floor / ceil / round : Arrondit un nombre vers le bas, le haut ou à l’entier le plus proche.
  • sqrt : Calcule la racine carrée d’un nombre.
  • tonumber : Convertit une chaîne en nombre.
  • type : Renvoie le type JSON d’une valeur (string, number, object, etc.).
  • tostring : Convertit une valeur en chaîne de caractères.
  • isfinite / isnan / isinfinite : Vérifie les propriétés d’un nombre.
  • recurse : Parcourt récursivement une structure JSON.
  • walk : Applique une fonction à chaque élément d’une structure JSON.
  • paths / getpath / setpath : Travaille avec les chemins dans une structure JSON.
  • if / then / else / end : Structure conditionnelle.
  • try / catch : Gestion des erreurs.
  • empty : Ne produit aucune sortie, utile pour filtrer des éléments.
  • range : Génère une séquence de nombres.
  • error : Génère une erreur personnalisée.
  • input / inputs : Lit des entrées supplémentaires.

Pour une liste complète et détaillée des fonctions intégrées de jq, consulte la documentation officielle : https://jqlang.org/manual/

Voici alors des exemples concrets inédits de fonctions intégrées avancées de jq, toujours à partir de l’endpoint https://jsonplaceholder.typicode.com/users, et non couvertes précédemment :

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | {id_texte: (.id | tostring)}'

→ Convertit le champ numérique id en texte, utile pour concaténations ou formats spécifiques.

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | {nom: (.name | type), adresse: (.address | type)}'

→ Affiche les types de données (string, object, etc.) pour des champs donnés.

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[0] | with_entries(.key |= ascii_upcase)'

→ Met en majuscules toutes les clés du premier utilisateur.

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[0] | to_entries | map(.key += "_mod") | from_entries'

→ Renomme toutes les clés du premier utilisateur en ajoutant un suffixe _mod.

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[0] | recurse(.[]? | select(type == "object"))'

→ Explore récursivement toutes les clés imbriquées du premier utilisateur.

Fenêtre de terminal
curl -s https://jsonplaceholder.typicode.com/users | jq '.[0] | walk(if type == "string" then ascii_downcase else . end)'

→ Met en minuscules toutes les chaînes de caractères du premier utilisateur, quelle que soit leur profondeur.

À travers ce guide, tu as appris à manipuler les données JSON en ligne de commande avec jq, depuis les bases jusqu’aux transformations complexes. Grâce à cette maîtrise, tu peux maintenant intégrer jq dans tes scripts d’automatisation, que ce soit pour :

  • Extraire des métriques de réponse API,
  • Nettoyer des données JSON pour des dashboards ou du monitoring,
  • Convertir des objets complexes en formats simplifiés pour des outils CLI ou des pipelines CI/CD.

jq est compact, rapide, sans dépendance, et surtout puissant : c’est un outil incontournable pour tout administrateur système, développeur ou DevOps travaillant avec des flux JSON.