Come utilizzare il comando jq per elaborare JSON in Linux

Come utilizzare il comando jq per elaborare JSON in Linux
Una fotografia di un monitor che mostra un file JSON.

Jq è un programma parser potente e altamente flessibile in grado di trasmettere e filtrare i dati JSON da file e pipe UNIX. Questo articolo ti insegnerà le basi di jq, presenterà esempi di codice e alcune implementazioni alternative che puoi installare oggi.

A cosa serve jq?

L’uso più comune di jq è per l’elaborazione e la manipolazione delle risposte JSON dalle API Software-as-a-Service (SaaS). Ad esempio, puoi utilizzare jq insieme a cURL per accedere agli endpoint API di Digitalocean per ottenere i dettagli del tuo account.

Un terminale che mostra un esempio di accesso API per Digitalocean a jq.

Oltre a ciò, jq è anche una potente utility per la gestione di file JSON di grandi dimensioni. Alcuni dei programmi di database più popolari oggi come MongoDB, PostgreSQL e MySQL supportano JSON come modo per archiviare i dati. Pertanto, imparare jq ti dà un vantaggio nel comprendere come funzionano questi sistemi di database.

Installazione e utilizzo di jq

Per iniziare con jq, installa il suo pacchetto binario sul tuo sistema:

Trova un endpoint API aperto su cui puoi testare jq. Nel mio caso, utilizzerò l’API di controllo IP di ipinfo.io.

Utilizzare il sito Web Jq Json Linux 02 Ipinfo Saas

Il filtro più semplice per jq è il filtro punto (.). Questo stamperà piuttosto la risposta JSON come jq l’ha ricevuta dal suo input standard:

Un altro filtro di base è il simbolo della barra verticale (|). Questo è un filtro speciale che passa l’output di un filtro come input di un altro:

Il valore dopo l’operatore pipe è l'”Indice identificatore oggetto”. Questo cerca nell’input JSON qualsiasi variabile che corrisponda al suo testo e ne stampa il valore sul terminale. In questo caso sto cercando il valore della chiave “ip:”.

Un terminale che mostra l'output filtrato dell'API SaaS ipinfo tramite jq.

Una volta fatte e spolverate le nozioni di base, le sezioni seguenti ti mostreranno alcuni dei trucchi che puoi eseguire utilizzando jq.

1. Creazione di un lettore di feed di base con jq

La maggior parte dei siti Web moderni offre oggi endpoint API aperti per la lettura dei dati all’interno delle proprie piattaforme. Ad esempio, ogni repository Github ha il proprio URL API per recuperare gli ultimi commit e problemi per quel progetto.

Un terminale che mostra l'impostazione predefinita

Puoi utilizzare un endpoint API come questo con jq per creare il tuo semplice feed “simile a RSS”. Per iniziare, utilizza cURL per verificare se l’endpoint funziona correttamente:

Esegui quanto segue per stampare la prima voce nel tuo feed:

Questo mostrerà i diversi campi che l’API Github invia a jq. Puoi utilizzarli per creare il tuo oggetto JSON personalizzato reindirizzando l’input al {}filtro delle parentesi graffe ( ):

L’aggiunta del filtro virgola (,) all’interno delle parentesi graffe ti consente di aggiungere più campi al tuo oggetto personalizzato:

Un terminale che mostra un oggetto JSON rimosso personalizzato dall'API Github.

Rimuovendo lo “0” all’interno delle parentesi quadre verrà applicato il filtro jq all’intero feed:

Puoi anche creare un piccolo script Bash per visualizzare gli ultimi numeri del tuo progetto Github preferito. Incolla il seguente blocco di codice all’interno di un file script di shell vuoto:

Salva il file, quindi esegui il comando seguente per renderlo eseguibile:

Metti alla prova il tuo nuovo lettore di feed elencando l’ultimo numero nel tuo repository Github preferito:

Un terminale che mostra lo script personalizzato in funzione e stampa il numero più recente di Github.

2. Lettura e ricerca in un database JSON

Oltre a leggere i dati dalle API, puoi anche utilizzare jq per gestire i file JSON nel tuo computer locale. Inizia creando un semplice file di database JSON utilizzando il tuo editor di testo preferito:

Incolla il seguente blocco di dati all’interno del tuo file, quindi salvalo:

Verifica se jq legge correttamente il tuo file JSON stampando il primo oggetto nell’array del database:

Un terminale che mostra jq che stampa la prima voce nel database JSON.

Effettua una query sul tuo database JSON utilizzando il filtro “Indice identificatore oggetto”. Nel mio caso, sto cercando il valore della chiave “.name” su ogni voce nel mio database:

Puoi anche utilizzare alcune delle funzioni integrate di jq per filtrare le tue query in base a determinate qualità. Ad esempio, puoi cercare e stampare tutti gli oggetti JSON che hanno un valore “.name” con più di sei caratteri:

Un terminale che mostra l'output di jq con un vincolo sulla lunghezza del nome.

Operando su database JSON con jq

In aggiunta a ciò, jq può operare su database JSON in modo simile a un foglio di calcolo di base. Ad esempio, il comando seguente stampa la somma totale della chiave “.balance” per ogni oggetto nel database:

Puoi anche estenderlo aggiungendo un’istruzione condizionale alla tua query. Quanto segue aggiungerà “.balance” solo se il valore “.name” del secondo oggetto è “Alice”:

Un terminale che mostra l'istruzione condizionale in jq in esecuzione sul database.

È possibile rimuovere temporaneamente le variabili dal database JSON. Questo può essere utile se stai testando il filtro e vuoi assicurarti che possa ancora elaborare il tuo set di dati:

Un terminale che mostra la seconda voce senza chiave JSON con nome.

Puoi anche inserire nuove variabili nel tuo database utilizzando l’operatore “+”. Ad esempio, la riga seguente aggiunge la variabile “active: true” al primo oggetto nel database:

Un terminale che mostra un valore chiave aggiuntivo sulla prima voce del database.

3. Trasformare i dati non JSON in jq

Un’altra caratteristica brillante di jq è che può accettare e funzionare con dati non JSON. Per raggiungere questo obiettivo, il programma utilizza una “modalità slurp” alternativa in cui converte qualsiasi spazio e dati delimitati da nuova riga in un array JSON.

Puoi abilitare questa funzione collegando i dati a jq con un -sflag:

Un terminale che mostra una stringa di testo convertita in un array JSON.

Un vantaggio di convertire i dati grezzi in un array è che puoi indirizzarli utilizzando i numeri di indice dell’array. Il seguente comando aggiunge due valori facendo riferimento alla posizione dell’array convertito:

Puoi portare ulteriormente questa posizione dell’array e costruire un nuovo codice JSON attorno ad essa. Ad esempio, questo codice converte il testo dal comando echo in un oggetto JSON tramite il filtro delle parentesi graffe:

Un terminale che mostra un oggetto JSON personalizzato nel formato del database di esempio.

Oltre ad acquisire dati grezzi, jq può anche restituire dati non JSON come output. Ciò è utile se stai utilizzando jq come parte di uno script di shell più ampio e hai solo bisogno del risultato dei suoi filtri.

Per fare ciò, esegui jq seguito dal -rflag. Ad esempio, il comando seguente legge tutti i nomi dal mio file di database e li restituisce come dati di testo semplice:

Un terminale che mostra l'elenco dei nomi dal database senza la formattazione.

Parser JSON alternativi a jq

Poiché il codice per jq è open source, vari sviluppatori hanno creato le proprie versioni del parser JSON. Ognuno di questi ha il proprio punto di forza unico che migliora o modifica una parte fondamentale di jq.

1 mi piace

Jaq è un potente parser JSON che fornisce una funzionalità quasi identica impostata su jq.

Scritto in Rust, uno dei maggiori punti di forza di Jaq ​​è che può eseguire il linguaggio jq fino a 30 volte più velocemente del parser originale pur mantenendo la compatibilità con le versioni precedenti. Questo da solo lo rende prezioso quando esegui filtri jq di grandi dimensioni e desideri massimizzare le prestazioni della tua macchina.

Un terminale che mostra jaq in esecuzione sul mio database di esempio.

Detto questo, uno svantaggio di jaq è che non è attualmente disponibile sui repository Debian, Ubuntu e Fedora. L’unico modo per ottenerlo è scaricare Homebrew o compilarlo dal sorgente.

2. Vai

Gojq è un parser JSON alternativo scritto interamente in Go. Fornisce una versione accessibile e facile da usare di jq che puoi installare su quasi tutte le piattaforme.

Il programma jq originale può essere incredibilmente conciso nei suoi messaggi di errore. Di conseguenza, il debug degli script jq è particolarmente difficile per un nuovo utente jq. Gojq risolve questo problema mostrandoti dove si trova l’errore nel tuo script e fornendo messaggi dettagliati sul tipo di errore che si è verificato.

Un terminale che mostra un database di esempio letto per gojq.

Un altro punto di forza di gojq è che può leggere ed elaborare sia file JSON che YAML. Ciò può essere particolarmente utile se sei un utente Docker e Docker Compose e desideri automatizzare il flusso di lavoro di distribuzione.

Il problema più grande di Gojq è che ha rimosso alcune delle funzionalità presenti di default nel parser jq originale. Ad esempio, opzioni come --ascii-output, --seq, e --sort-keysnon esistono su gojq.

3. fq

A differenza di jaq e gojq, fq è un toolkit software completo in grado di analizzare sia testo che dati binari. Può funzionare con una varietà di formati popolari come JSON, YAML, HTML e persino FLAC.

Un terminale che mostra fq che legge il file di database di esempio.

La più grande caratteristica di fq è che contiene un lettore esadecimale integrato per i file. Ciò rende banale esaminare la struttura interna di un file per determinare come è fatto e se c’è qualcosa di sbagliato in esso. A parte questo, fq usa anche la stessa sintassi di jq quando ha a che fare con il testo, il che lo rende facile da imparare per chiunque abbia già familiarità con jq.

Uno svantaggio di questo ambizioso obiettivo è che fq è ancora in fase di intenso sviluppo. Pertanto, alcune funzionalità e comportamenti del programma sono ancora soggetti a cambiamenti radicali.

Esplorare jq, come funziona e cosa lo rende speciale è solo il primo passo per imparare a creare programmi sul tuo computer. Immergiti profondamente nel meraviglioso mondo della codifica leggendo le basi della programmazione della shell.

Credito immagine: Ferenc Almasi tramite Unsplash . Tutte le modifiche e gli screenshot di Ramces Red.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *