Comment analyser un fichier JSON à partir de la ligne de commande Linux en utilisant JQ
- 3605
- 469
- Noa Faure
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
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