GNU/Linux >> Linux Esercitazione >  >> Linux

Come analizzare e stampare in modo grazioso JSON con gli strumenti della riga di comando di Linux

JSON è un formato di archiviazione dati leggero e indipendente dal linguaggio, facile da integrare con la maggior parte dei linguaggi di programmazione e anche di facile comprensione per gli esseri umani, ovviamente se formattato correttamente. La parola JSON sta per J avaS script O oggetto N otation, sebbene inizi con JavaScript e utilizzato principalmente per scambiare dati tra server e browser, ma ora viene utilizzato in molti campi, inclusi i sistemi incorporati. Qui analizzeremo e stamperemo in modo grazioso JSON con strumenti da riga di comando su Linux. È estremamente utile per gestire dati JSON di grandi dimensioni in script di shell o per manipolare dati JSON in uno script di shell.

Cos'è una bella stampa?

I dati JSON sono strutturati per essere un po' più leggibili dall'uomo. Tuttavia, nella maggior parte dei casi, i dati JSON vengono archiviati in una singola riga, anche senza un carattere di fine riga.

Ovviamente non è molto comodo per leggere e modificare manualmente.

È allora che una bella stampa è utile. Il nome è abbastanza autoesplicativo, riformattando il testo JSON per renderlo più leggibile dagli esseri umani. Questo è noto come stampa carina JSON .

Analizza e stampa JSON usando jq in linux

I dati JSON possono essere analizzati con processori di testo a riga di comando come awk , sed e gerp . In effetti JSON.awk è uno script awk per farlo. Tuttavia ci sono alcuni strumenti dedicati allo stesso scopo.

  1. jq o jshon , parser JSON per shell, entrambi sono abbastanza utili.
  2. Script di shell come JSON.sh o jsonv.sh per analizzare JSON in bash, zsh o dash shell.
  3. JSON.awk , Script awk del parser JSON.
  4. Moduli Python come json.tool .
  5. underscore-cli , basato su Node.js e javascript.

In questo tutorial mi concentrerò solo su jq , che è un parser JSON abbastanza potente per shell con funzionalità avanzate di filtraggio e scripting.

JSON bella stampa

I dati JSON potrebbero essere in uno e quasi illeggibili per gli esseri umani, quindi per renderli in qualche modo leggibili, la bella stampa JSON è qui.

Esempio: Un dato da jsonip.com , per ottenere un indirizzo IP esterno in formato JSON, utilizza curl o wget strumenti come di seguito.

$ wget -cq http://jsonip.com/ -O -

I dati effettivi si presentano così:

{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}

Ora stampalo con jq:

$ wget -cq http://jsonip.com/ -O - | jq '.'

Dovrebbe apparire come di seguito, dopo aver filtrato il risultato con jq.

{

   "ip": "111.222.333.444",

   "about": "/about",

   "Pro!": "http://getjsonip.com"

}

La stessa cosa potrebbe essere fatta con python json.tool modulo. Ecco un esempio:

$ cat anything.json | python -m json.tool

Questa soluzione basata su Python dovrebbe andare bene per la maggior parte degli utenti, ma non è così utile quando Python non è preinstallato o non può essere installato, come sui sistemi embedded.

Tuttavia, il modulo python json.tool ha un netto vantaggio, è multipiattaforma. Quindi puoi usarlo senza problemi su Windows, Linux o mac OS.

Lettura consigliata:

  • Prettyping – Rendi l'output del comando Ping più carino e più facile da leggere

Come analizzare JSON con jq

Per prima cosa, devi installare jq, è già raccolto dalla maggior parte delle distribuzioni GNU/Linux, installalo con i rispettivi comandi di installazione dei pacchetti.

Su Arch Linux:

$ sudo pacman -S jq

Su Debian, Ubuntu, Linux Mint:

$ sudo apt-get install jq

Su Fedora:

$ sudo dnf install jq

Su openSUSE:

$ sudo zypper install jq

Per altri sistemi operativi o piattaforme, consulta le istruzioni di installazione ufficiali.

Filtri di base e identificatori di jq

jq potrebbe leggere i dati JSON sia da stdin o un file . Devi usarli entrambi a seconda della situazione.

L'unico simbolo di . è il filtro più elementare. Questi filtri sono anche chiamati indice-identificatore oggetto . Utilizzando un singolo . insieme a jq fondamentalmente stampa abbastanza il file JSON di input.

virgolette singole - Non è necessario utilizzare sempre la virgoletta singola. Ma se stai combinando più filtri in un'unica riga, devi usarli.

virgolette doppie - Devi racchiudere qualsiasi carattere speciale come @ , # , $ tra due virgolette, come in questo esempio, jq .foo."@bar"

Stampa di dati grezzi - Per qualsiasi motivo, se hai bisogno solo dei dati finali analizzati, non racchiusi tra virgolette doppie, usa il flag -r con il comando jq, in questo modo. - jq -r .foo.bar .

Analisi di dati specifici

Per filtrare una parte specifica di JSON, devi esaminare la gerarchia dei dati del file JSON stampato.

Un esempio di dati JSON, da Wikipedia:

{

  "firstName": "John",

  "lastName": "Smith",

  "age": 25,

  "address": {

    "streetAddress": "21 2nd Street",

    "city": "New York",

    "state": "NY",

    "postalCode": "10021"

},

  "phoneNumber": [

{

  "type": "home",

  "number": "212 555-1234"

},

{

  "type": "fax",

  "number": "646 555-4567"

}

],

  "gender": {

  "type": "male"

  }

}

Userò questi dati JSON come esempio in questo tutorial, li ho salvati come sample.json .

Diciamo che voglio filtrare l'indirizzo dal file sample.json. Quindi il comando dovrebbe essere come:

$ jq .address sample.json

Risultato di esempio:

{

  "streetAddress": "21 2nd Street",

  "city": "New York",

  "state": "NY",

  "postalCode": "10021"

}

Di nuovo diciamo che voglio il codice postale, quindi devo aggiungere un altro indice-identificatore oggetto , ovvero un altro filtro.

$ cat sample.json | jq .address.postalCode

Tieni inoltre presente che i filtri fanno distinzione tra maiuscole e minuscole e devi usare la stessa identica stringa per ottenere un output significativo invece di null.

Analisi degli elementi dall'array JSON

Gli elementi dell'array JSON sono racchiusi tra parentesi quadre, senza dubbio abbastanza versatili da usare.

Per analizzare gli elementi di un array, devi utilizzare l'[]identificatore insieme ad altri indici di identificatori di oggetti.

In questo esempio di dati JSON, i numeri di telefono sono archiviati all'interno di un array, per ottenere tutto il contenuto da questo array, devi utilizzare solo le parentesi, come in questo esempio.

$ jq .phoneNumber[] sample.json

Diciamo che vuoi solo il primo elemento dell'array, quindi usa i numeri degli oggetti dell'array che iniziano per 0, per il primo elemento, usa [0] , per gli elementi successivi, dovrebbe essere incrementato di uno ad ogni passaggio.

$ jq .phoneNumber[0] sample.json

Esempi di script

Diciamo che voglio solo il numero per la casa, non l'intero array JSON. Ecco quando lo scripting all'interno del comando jq torna utile.

$ cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'

Qui prima sto collegando i risultati di un filer a un altro, quindi sto usando l'attributo select per selezionare un particolare tipo di dati, e di nuovo il risultato è stato reindirizzato a un altro filtro.

Spiegare ogni tipo di filtri e script jq va oltre lo scopo e lo scopo di questo tutorial. Si consiglia vivamente di leggere il manuale JQ per una migliore comprensione riportato di seguito.


Linux
  1. Flatpak su Linux:cos'è e come installare app con esso

  2. Come comprimere file e directory su Linux (con esempi)

  3. Come lavorare con utenti e gruppi in Linux

  4. Come analizzare Json con lo script della shell in Linux?

  5. Come stampare un intervallo di indirizzi IP con il comando Linux seq

Come confrontare i comandi e i programmi Linux dalla riga di comando

Come condividere in modo sicuro i file dalla riga di comando con ffsend in Linux

Come visualizzare l'utilizzo del disco con Duf su Linux e Unix

Come eseguire il backup e il ripristino del sistema Linux con Timeshift

Come lavorare con il processo in primo piano e in background in Linux

Come eliminare file e directory utilizzando la riga di comando di Linux