Comment analyser un fichier JSON à partir de la ligne de commande Linux en utilisant JQ

Comment analyser un fichier JSON à partir de la ligne de commande Linux en utilisant JQ

Le Json (Notation d'objet JavaScript) Le format est largement utilisé pour représenter les structures de données et est fréquemment utilisé pour échanger des données entre différentes couches d'une application, ou par l'utilisation d'appels API. Nous savons probablement comment interagir avec des données formulées JSON avec les langages de programmation les plus utilisés tels que l'analyse JSON avec Python, mais que se passe-t-il si nous devons interagir avec elle à partir de la ligne de commande, ou dans un script bash? Dans cet article, nous verrons comment nous pouvons accomplir une telle tâche en utilisant le jq utilité et nous apprendrons son utilisation de base.

Dans ce tutoriel, vous apprendrez:

  • Comment installer JQ dans les distributions Linux les plus utilisées ou la compiler à partir de la source
  • Comment utiliser JQ pour analyser les données format par JSON
  • Comment combiner des filtres en utilisant «» et «|»
  • Comment utiliser la longueur, les clés, les fonctions a et la carte



Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution
Logiciel L'application JQ
Autre Familiarité avec les données JSON et le shell bash
Conventions # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

Installation

Le jq L'utilitaire est inclus dans tous les principaux référentiels de distribution Linux, donc l'installer est très facile: nous avons juste besoin d'utiliser notre gestionnaire de packages préféré. Si nous utilisons Debian ou une distribution basée à Debian comme Ubuntu ou Linux Mint, nous pouvons utiliser apte:

$ sudo apt installer jq


Si nous avons une préférence pour la famille de distributions Red Hat, comme Fedora, Centos ou Rhel, nous pouvons installer jq via le DNF Gestionnaire de packages (dans les versions récentes de ces distributions, il a remplacé Yum). Pour installer le package, nous exécutrions:

$ sudo dnf installer jq

Installation jq sur Archlinux est tout aussi facile. Le gestionnaire de packages de distribution est Pac-Man, Et le package est disponible dans le référentiel communautaire. Nous pouvons effectuer l'installation avec la commande suivante:

$ sudo pacman -s installer jq

Si nous ne pouvons pas, ou pour une raison quelconque, nous ne voulons pas utiliser un package binaire prédéfini, nous pouvons compiler JQ à partir de la source. Dans
Les lignes suivantes nous décrivons les étapes nécessaires.

Construction et installation à partir de la source

Pour construire et installer JQ à partir de Source, la première chose que nous devons faire est de télécharger une version Tarball. Lors de
Écriture, la dernière version disponible est 1.6. Pour télécharger le tarball sans quitter le terminal, nous pouvons utiliser wget:

$ wget https: // github.com / Stedolan / jq / releases / download / jq-1.6 / jq-1.6.le goudron.gz

Une fois le téléchargement terminé, nous devons décompresser et extraire le tarball:

$ TAR -XZF JQ-1.6.le goudron.gz

L'étape suivante consiste à entrer le JQ-1.6 Répertoire, créé à la suite de la dernière commande:

$ CD JQ-1.6

Maintenant, pour compiler le code source, nous avons besoin des utilitaires suivants:

  • GCC
  • automake
  • libtool
  • faire

Pour construire le logiciel que nous exécutons:

$ AutoreConf -fi $ ./ configurer && make && sudo faire l'installation 
Copie

Le faire l'installation La commande, par défaut, entraînera l'installation des binaires dans le / usr / local / bac répertoire et bibliothèques en / usr / local / lib. Si nous souhaitons personnaliser l'installation et modifier ces répertoires, nous devons spécifier un préfixe différent, en utilisant le --préfixe option lors du lancement du ./ Configurer scénario.

Par exemple, pour installer le logiciel uniquement pour un utilisateur spécifique, nous pourrions passer le $ Home /.local Répertoire en tant que préfixe: dans ce cas, les binaires seraient installés dans $ Home /.local / bac et les bibliothèques dans le $ Home /.local / lib; Avec une telle configuration, il ne serait pas nécessaire de lancer le faire l'installation commande avec les privilèges administratifs. Si vous souhaitez savoir comment mieux organiser la source de formulaire installé par les logiciels, vous pouvez consulter notre article sur l'utilitaire GNU Stow.

Usage

Une fois que nous avons jq Installé, nous pouvons l'utiliser pour analyser les fichiers JSON à partir de la ligne de commande. Pour le bien de ce tutoriel, nous travaillerons avec une structure de données simple qui contient quelques détails sur trois caractères du Lord of the Rings Book. Les données sont enregistrées dans le personnages.json déposer.

Le jq L'utilitaire fonctionne en appliquant des filtres sur un flux de données JSON. En première chose, nous utiliserons le filtre le plus simple, ., qui renvoie les données d'entrée inchangées mais assez imprimées. Pour cette caractéristique, il peut être utilisé pour formater les données de manière plus lisible:

$ jq . personnages.json

La commande ci-dessus produit la sortie suivante:

"caractères": ["name": "aragorn", "race": "man", "name": "gimli", "race": "dwarf", "name": "Legolas" , "race": "elf"] 
Copie

Maintenant, supposons que nous voulons filtrer les données pour obtenir uniquement la valeur associée au personnages clé. Pour accomplir la tâche, nous fournissons le nom de la clé et obtenons sa valeur (ou nul s'il n'existe pas):

$ jq .personnages personnages.json

Dans notre exemple, la valeur associée à la clé «caractères» est un déployer, Nous obtenons donc le résultat suivant:

["name": "aragorn", "race": "man", "name": "gimli", "race": "dwarf", "name": "Legolas", "race": "elfe"]
Copie

Et si nous voulons obtenir uniquement le premier élément du tableau? Nous avons juste besoin de «extraire» le bon indice. Sachant que les tableaux sont zéro, Nous pouvons courir:

$ jq .caractères [0] caractères.json


La commande nous donne:

"name": "aragorn", "race": "man" 
Copie

Nous pouvons également obtenir une tranche du tableau. Dites, par exemple, nous voulons obtenir uniquement ses deux premiers éléments. Nous courrons:

$ jq .caractères [0: 2] caractères.json

La commande nous donne le résultat suivant:

["name": "aragorn", "race": "man", "name": "gimli", "race": "dwarf"] 
Copie

Le tranchage fonctionne également sur les chaînes, donc si nous courons:

$ jq .caractères [0].nom [0: 2] caractères.json

Nous obtenons une tranche (les deux premières lettres) de la chaîne «Aragorn»: "Ar".

Accédez aux éléments du tableau séparément

Dans les exemples ci-dessus, nous avons imprimé le contenu du tableau des «caractères», qui se composent de trois objets qui décrivent des personnages fantastiques. Et si nous voulions itérer sur ledit tableau? Nous devons faire de sorte que les éléments y contenus sont retournés séparément, nous devons donc utiliser [] sans fournir d'index:

$ jq .personnages [] personnages.json

La sortie de la commande est:

"name": "aragorn", "race": "man" "name": "gimli", "race": "naine", "arme": "ax" "name": "Legolas" , "race": "elfe" 
Copie

Dans ce cas, nous avons obtenu 3 résultats: les objets contenus dans le tableau. La même technique peut être utilisée pour parcourir les valeurs d'un objet, dans ce cas la première contenue dans le tableau «caractères»:

$ jq .caractères [0] [] caractères.json

Ici, nous obtenons le résultat suivant:

"Aragorn" "Man" 
Copie

Le «» et «|» les opérateurs

Le «» et «|» Les opérateurs sont tous deux utilisés pour combiner deux filtres ou plus, mais ils fonctionnent de différentes manières. Lorsque deux filtres sont séparés par une virgule, ils sont tous deux appliqués, séparément, sur les données données et obtenons deux résultats différents. Voyons un exemple:

$ JQ '.caractères [0], .personnages [2] 'caractères.json

Les données JSON formatées contenues dans les caractères.Le fichier JSON est d'abord filtré avec .caractères [0] Et puis avec .Charaters [2], Pour obtenir le premier et le troisième élément du tableau «personnages». En exécutant la commande ci-dessus, nous en obtenons deux séparé résultats:

"name": "aragorn", "race": "man" "name": "Legolas", "race": "elf"
Copie

Le «|» L'opérateur fonctionne différemment, d'une manière similaire à une pipe Unix. La sortie produite par le filtre à gauche de l'opérateur, est transmise comme entrée au filtre à droite de l'opérateur. Si un filtre à gauche de l'opérateur produit plusieurs résultats, le filtre à droite de l'opérateur est appliqué à chacun d'eux:

$ JQ '.caractères [] | .Nom 'caractères.json

Dans cet exemple, nous avons deux filtres. À gauche de l'opérateur, nous avons le .personnages[] Filtre qui, comme nous l'avons vu précédemment, obtenons les éléments du tableau des «caractères» comme résultats distincts. Dans notre cas, chaque résultat est un objet avec le "nom" et "course" propriétés. Le .nom filtre à droite du | L'opérateur est appliqué à chacun des objets, nous obtenons donc le résultat suivant:

"Aragorn" "gimli" "Legolas"
Copie

Les fonctions

L'utilitaire JQ comprend des fonctions très utiles que nous pouvons appliquer au JSON - Données formatées. Nous allons maintenant en voir certains: longueur, clés, a et carte.



La fonction de longueur

Le premier dont nous parlerons est longueur, qui, comme son nom l'indique, récupérons la longueur des objets, des tableaux et des chaînes. La longueur des objets est le nombre de leurs paires de valeurs clés; La longueur des tableaux est représentée par le nombre d'éléments qu'ils contiennent; La longueur d'une chaîne est le nombre de caractères dont il est composé. Voyons comment utiliser la fonction. Supposons que nous voulons connaître la longueur du tableau des «personnages», nous exécutons:

$ JQ '.Personnages | Caractères de longueur.json

Comme prévu, nous obtenons 3 Par conséquent, puisque c'est le nombre d'éléments dans le tableau. De la même manière, pour obtenir la longueur du premier objet dans le tableau, nous pourrions exécuter:

$ JQ '.caractères [0] | Caractères de longueur.json

Cette fois, nous obtenons 2 par conséquent, puisque c'est le nombre de paires de valeur contenues dans l'objet. Comme nous l'avons déjà dit, la même fonction appliquée à une chaîne, renvoie le nombre de caractères qui y sont contenus, donc, par exemple, en cours d'exécution:

$ JQ '.caractères [0].Nom | Caractères de longueur.json

Nous recevons 7 en conséquence, qui est la longueur de la chaîne «aragorn».

La fonction des touches

Le clés La fonction peut être appliquée sur des objets ou des tableaux. Dans le premier cas, il renvoie un tableau contenant
Les touches d'objets:

$ JQ '.caractères [0] | Personnages de Keys.JSON ["nom", "race"]
Copie

Lorsqu'il est appliqué à un tableau, il renvoie un autre tableau contenant les indices du premier:

$ JQ '.Personnages | Personnages de Keys.JSON [0, 1, 2] 
Copie

Le clés La fonction renvoie les éléments triés: si nous voulons que les éléments soient retournés dans l'ordre d'insertion, nous pouvons utiliser le keys_unsorted fonction à la place.

Vérifier si un objet a une clé

Une opération très courante que nous pouvons vouloir effectuer sur un objet, consiste à vérifier si elle contient une clé spécifique. Pour accomplir cette tâche, nous pouvons utiliser le a fonction. Par exemple, pour vérifier si l'objet principal de nos données de format JSON contient la clé «Armes», nous pourrions courir:

$ jq 'a ("armes") des personnages.JSON FAUX
Copie

Dans ce cas, comme prévu, la fonction a renvoyé FAUX Puisque l'objet ne contient que la clé "caractères":

$ JQ 'a ("personnages") des personnages.JSON True
Copie

Lorsqu'il est appliqué aux tableaux, la fonction renvoie true si le tableau a un élément à l'index donné ou faux sinon:

$ JQ '.Personnages | a (3) 'caractères.JSON FAUX
Copie

Le tableau des «personnages» n'a que 3 éléments; Les tableaux sont indexés zéro, alors vérifiant si le tableau comme un élément associé à l'index 3 Retour FAUX.

La fonction de carte

La fonction de carte applique un filtre à chaque élément d'un tableau donné. Par exemple, disons que nous voulons vérifier l'existence de la clé «nom» dans chacun des objets contenus dans le tableau «caractères». Nous pouvons combiner le carte et a Fonctions de cette façon:

$ JQ '.Personnages | Carte (a ("nom")) des caractères.JSON [vrai, vrai, vrai] 
Copie

Conclusions

Dans cet article, nous rayons à peine la surface des fonctionnalités proposées par le jq Utilité qui nous azage analysé et manipuler les données format JSON à partir de la ligne de commande. Nous avons appris l'utilisation de base du programme, comment le «» et «|» Les opérateurs fonctionnent, et comment utiliser la longueur, les clés, les fonctions de cartographie, pour obtenir respectivement les lentes des tableaux, des chaînes et des objets, obtenir des clés d'objet ou des index de tableau, vérifiez si une clé existe dans un objet ou si un tableau a un élément à l'indice donné, et appliquez un filtre ou une fonction à chaque élément d'un tableau. Pour découvrir tout jq peut faire, aller jeter un œil au manuel du programme!

Tutoriels Linux connexes:

  • Comment travailler avec l'API WooCommerce REST avec Python
  • Choses à installer sur Ubuntu 20.04
  • Introduction aux boucles JavaScript
  • Comment tracer les appels du système effectués par un processus avec Strace sur…
  • Masterring Bash Script Loops
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Manipulation de Big Data pour le plaisir et le profit Partie 1
  • Boucles imbriquées dans les scripts bash
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Comment utiliser un script bash pour exécuter vos scripts Python