Comment utiliser la commande jq pour traiter JSON sous Linux

Comment utiliser la commande jq pour traiter JSON sous Linux
Une photographie d'un moniteur affichant un fichier JSON.

Jq est un programme d’analyse puissant et très flexible qui peut diffuser et filtrer les données JSON à partir de fichiers et de canaux UNIX. Cet article vous apprendra les bases de jq, présentera des exemples de code, ainsi que quelques implémentations alternatives que vous pouvez installer aujourd’hui.

À quoi sert jq ?

L’utilisation la plus courante de jq concerne le traitement et la manipulation des réponses JSON à partir des API Software-as-a-Service (SaaS). Par exemple, vous pouvez utiliser jq avec cURL pour accéder aux points de terminaison de l’API de Digitalocean afin d’obtenir les détails de votre compte.

Un terminal montrant un exemple d'accès API pour Digitalocean à jq.

En dehors de cela, jq est également un utilitaire puissant pour gérer de gros fichiers JSON. Certains des programmes de bases de données les plus populaires aujourd’hui, tels que MongoDB, PostgreSQL et MySQL, prennent en charge JSON comme moyen de stocker des données. En tant que tel, apprendre jq vous donne un avantage dans la compréhension du fonctionnement de ces systèmes de bases de données.

Installation et utilisation de jq

Pour commencer avec jq, installez son package binaire sur votre système :

Recherchez un point de terminaison d’API ouvert sur lequel vous pouvez tester jq. Dans mon cas, je vais utiliser l’API du vérificateur IP d’ipinfo.io.

Utiliser le site Web Jq Json Linux 02 Ipinfo Saas

Le filtre le plus basique pour jq est le filtre point (.). Cela imprimera joliment la réponse JSON telle que jq l’a reçue de son entrée standard :

Un autre filtre de base est le symbole du tuyau (|). Il s’agit d’un filtre spécial qui transmet la sortie d’un filtre comme entrée d’un autre :

La valeur après l’opérateur pipe est « Object Identifier-Index ». Cela recherche dans votre entrée JSON toute variable qui correspond à son texte et imprime sa valeur sur le terminal. Dans ce cas, je recherche la valeur de la clé « ip : ».

Un terminal affichant la sortie filtrée de l'API SaaS ipinfo via jq.

Une fois les bases définies et dépoussiérées, les sections suivantes vous montreront quelques-unes des astuces que vous pouvez réaliser en utilisant jq.

1. Création d’un lecteur de flux de base avec jq

La plupart des sites Web modernes proposent aujourd’hui des points de terminaison API ouverts pour lire les données au sein de leurs plates-formes. Par exemple, chaque référentiel Github possède sa propre URL d’API qui vous permet de récupérer les derniers commits et problèmes pour ce projet.

Un terminal affichant la valeur par défaut

Vous pouvez utiliser un point de terminaison d’API comme celui-ci avec jq pour créer votre propre flux simple « de type RSS ». Pour commencer, utilisez cURL pour tester si le point de terminaison fonctionne correctement :

Exécutez la commande suivante pour imprimer la première entrée de votre flux :

Cela affichera les différents champs que l’API Github envoie à jq. Vous pouvez les utiliser pour créer votre propre objet JSON personnalisé en redirigeant l’entrée vers le filtre accolades ({} ):

L’ajout du filtre virgule (,) à l’intérieur des accolades vous permet d’ajouter plusieurs champs à votre objet personnalisé :

Un terminal affichant un objet JSON personnalisé supprimé de l'API Github.

La suppression du « 0 » à l’intérieur des crochets appliquera votre filtre jq à l’ensemble du flux :

Vous pouvez également créer un petit script Bash pour afficher les derniers numéros de votre projet Github préféré. Collez le bloc de code suivant dans un fichier de script shell vide :

Enregistrez votre fichier, puis exécutez la commande suivante pour le rendre exécutable :

Testez votre nouveau lecteur de flux en répertoriant le dernier numéro dans votre dépôt Github préféré :

Un terminal affichant le script personnalisé fonctionnant et imprimant le problème Github le plus récent.

2. Lecture et recherche dans une base de données JSON

En plus de lire les données des API, vous pouvez également utiliser jq pour gérer les fichiers JSON sur votre ordinateur local. Commencez par créer un simple fichier de base de données JSON à l’aide de votre éditeur de texte préféré :

Collez le bloc de données suivant dans votre fichier, puis enregistrez-le :

Testez si jq lit correctement votre fichier JSON en imprimant le premier objet de votre tableau de base de données :

Un terminal affichant jq imprimant la première entrée de la base de données JSON.

Faites une requête sur votre base de données JSON en utilisant le filtre « Object Identifier-Index ». Dans mon cas, je recherche la valeur de la clé « .name » sur chaque entrée de ma base de données :

Vous pouvez également utiliser certaines fonctions intégrées de jq pour filtrer vos requêtes en fonction de certaines qualités. Par exemple, vous pouvez rechercher et imprimer tous les objets JSON qui ont une valeur « .name » de plus de six caractères :

Un terminal affichant la sortie de jq avec une contrainte de longueur de nom.

Fonctionner sur des bases de données JSON avec jq

En plus de cela, jq peut fonctionner sur des bases de données JSON similaires à une feuille de calcul de base. Par exemple, la commande suivante imprime la somme totale de la clé « .balance » pour chaque objet de la base de données :

Vous pouvez même étendre cela en ajoutant une instruction conditionnelle à votre requête. Ce qui suit n’ajoutera le « .balance » que si la valeur « .name » du deuxième objet est « Alice » :

Un terminal affichant l'instruction conditionnelle dans jq exécuté sur la base de données.

Il est possible de supprimer temporairement des variables de votre base de données JSON. Cela peut être utile si vous testez votre filtre et que vous souhaitez vous assurer qu’il peut toujours traiter votre ensemble de données :

Un terminal affichant la deuxième entrée sans clé JSON nommée.

Vous pouvez également insérer de nouvelles variables dans votre base de données à l’aide de l’opérateur « + ». Par exemple, la ligne suivante ajoute la variable « active : true » au premier objet de la base de données :

Un terminal affichant une valeur de clé supplémentaire sur la première entrée de base de données.

3. Transformation de données non JSON en jq

Une autre fonctionnalité intéressante de jq est qu’il peut accepter et travailler avec des données non JSON. Pour y parvenir, le programme utilise un « mode slurp » alternatif dans lequel il convertit toutes les données délimitées par des espaces et des nouvelles lignes en un tableau JSON.

Vous pouvez activer cette fonctionnalité en redirigeant les données vers jq avec un -sindicateur :

Un terminal affichant une chaîne de texte convertie en tableau JSON.

L’un des avantages de la conversion de vos données brutes en tableau est que vous pouvez les traiter à l’aide des numéros d’index du tableau. La commande suivante ajoute deux valeurs en faisant référence à leur emplacement de tableau converti :

Vous pouvez aller plus loin dans cet emplacement de tableau et construire un nouveau code JSON autour de lui. Par exemple, ce code convertit le texte de la commande echo en un objet JSON via le filtre entre accolades :

Un terminal affichant un objet JSON personnalisé au format de l'exemple de base de données.

En plus de récupérer des données brutes, jq peut également renvoyer des données non JSON en sortie. Ceci est utile si vous utilisez jq dans le cadre d’un script shell plus grand et que vous n’avez besoin que du résultat de ses filtres.

Pour ce faire, exécutez jq suivi du -rdrapeau. Par exemple, la commande suivante lit tous les noms de mon fichier de base de données et les renvoie sous forme de données en texte brut :

Un terminal affichant la liste des noms de la base de données sans leur formatage.

Analyseurs JSON alternatifs à jq

Le code de jq étant open source, divers développeurs ont créé leurs propres versions de l’analyseur JSON. Chacun d’eux a son propre argument de vente unique qui améliore ou modifie une partie essentielle de jq.

1 J’aime

Jaq est un puissant analyseur JSON qui fournit un ensemble de fonctionnalités presque identiques à jq.

Écrit en Rust, l’un des principaux arguments de vente de Jaq est qu’il peut exécuter le langage jq jusqu’à 30 fois plus rapidement que l’analyseur d’origine tout en conservant une compatibilité ascendante. Cela seul le rend précieux lorsque vous exécutez de grands filtres jq et que vous souhaitez maximiser les performances de votre machine.

Un terminal montrant jaq exécuté sur mon exemple de base de données.

Cela dit, l’un des inconvénients de jaq est qu’il n’est actuellement pas disponible sur les référentiels Debian, Ubuntu et Fedora. La seule façon de l’obtenir est de télécharger Homebrew ou de le compiler à partir des sources.

2. Allez

Gojq est un analyseur JSON alternatif entièrement écrit en Go. Il fournit une version accessible et facile à utiliser de jq que vous pouvez installer sur presque toutes les plateformes.

Le programme jq original peut être incroyablement concis dans ses messages d’erreur. En conséquence, le débogage des scripts jq est particulièrement difficile pour un nouvel utilisateur jq. Gojq résout ce problème en vous montrant où se trouve l’erreur dans votre script et en fournissant des messages détaillés sur le type d’erreur qui s’est produite.

Un terminal affichant un exemple de base de données lue pour gojq.

Un autre argument de vente de gojq est qu’il peut lire et traiter les fichiers JSON et YAML. Cela peut être particulièrement utile si vous êtes un utilisateur de Docker et Docker Compose et que vous souhaitez automatiser votre flux de travail de déploiement.

Le plus gros problème de Gojq est qu’il a supprimé certaines des fonctionnalités fournies par défaut sur l’analyseur jq d’origine. Par exemple, des options telles que --ascii-output, --seqet --sort-keysn’existent pas sur gojq.

3. fq

Contrairement à jaq et gojq, fq est une boîte à outils logicielle complète capable d’analyser à la fois du texte et des données binaires. Il peut fonctionner avec une variété de formats populaires tels que JSON, YAML, HTML et même FLAC.

Un terminal affichant fq lisant l'exemple de fichier de base de données.

La plus grande caractéristique de fq est qu’il contient un lecteur hexadécimal intégré pour les fichiers. Il est donc trivial d’examiner la structure interne d’un fichier pour déterminer comment il est créé et s’il y a quelque chose qui ne va pas. En dehors de cela, fq utilise également la même syntaxe pour jq lorsqu’il s’agit de texte, ce qui facilite l’apprentissage pour toute personne déjà familiarisée avec jq.

L’un des inconvénients de cet objectif ambitieux est que fq est encore en plein développement. En tant que tel, certaines fonctionnalités et comportements du programme sont encore sujets à des changements radicaux.

Explorer jq, son fonctionnement et ce qui le rend spécial n’est que la première étape pour apprendre à créer des programmes sur votre ordinateur. Plongez en profondeur dans le monde merveilleux du codage en lisant les bases de la programmation shell.

Crédit image : Ferenc Almasi via Unsplash . Toutes les modifications et captures d’écran par Ramces Red.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *