Aller au contenu
Administration Linux medium

jq : traiter du JSON en ligne de commande

17 min de lecture

jq est un outil en ligne de commande conçu pour lire, filtrer et transformer des données au format JSON. Dans un monde où les API 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 : des requêtes complexes sur des structures de données imbriquées, directement depuis un terminal, sans écrire de script Python ou JavaScript.

  • Lire et formater du JSON depuis un fichier ou un flux (stdin)
  • Extraire des champs précis avec les filtres .[], .key et les index
  • Filtrer et transformer avec select, map et del
  • Combiner des conditions (and / or, contains) et trier (sort_by)
  • Intégrer jq dans des scripts et des pipelines CI/CD

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, vous pourrez reproduire chaque commande sur votre 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, vous pouvez extraire précisément les éléments qui vous 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'

Vous pouvez 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.

  • jq lit du JSON depuis un fichier ou un flux (curl ... | jq '.')
  • Extraire : .[], .key, champ imbriqué .address.city, index .[2]
  • Filtrer : select(...), contains, conditions and / or
  • Transformer : map, del, objets {...}, tri sort_by
  • jq est compact, rapide et sans dépendance : idéal dans les scripts et les pipelines CI/CD

jq ne travaille jamais seul : il consomme le JSON produit par des requêtes API et s'insère dans des chaînes de traitement de texte. Voici les briques qui complètent votre maîtrise.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn