GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo analizar e imprimir bastante JSON con las herramientas de línea de comandos de Linux

JSON es un formato de almacenamiento de datos ligero e independiente del idioma, fácil de integrar con la mayoría de los lenguajes de programación y también fácil de entender por los humanos, por supuesto, cuando se formatea correctamente. La palabra JSON significa J avaS código O objeto N otation, aunque comienza con JavaScript, y se usa principalmente para intercambiar datos entre el servidor y el navegador, pero ahora se usa en muchos campos, incluidos los sistemas integrados. Aquí vamos a analizar e imprimir JSON con herramientas de línea de comandos en Linux. Es extremadamente útil para manejar grandes datos JSON en scripts de shell o manipular datos JSON en un script de shell.

¿Qué es la impresión bonita?

Los datos JSON están estructurados para ser algo más legibles por humanos. Sin embargo, en la mayoría de los casos, los datos JSON se almacenan en una sola línea, incluso sin un carácter de final de línea.

Obviamente, eso no es muy conveniente para leer y editar manualmente.

Ahí es cuando la impresión bonita es útil. El nombre se explica por sí mismo, reformateando el texto JSON para que sea más legible para los humanos. Esto se conoce como impresión bonita JSON. .

Analice e imprima bastante JSON usando jq en Linux

Los datos JSON se pueden analizar con procesadores de texto de línea de comandos como awk , sed y gerp . De hecho, JSON.awk es un script awk para hacer eso. Sin embargo, hay algunas herramientas dedicadas para el mismo propósito.

  1. jq o jshon , analizador JSON para shell, ambos son bastante útiles.
  2. Scripts de shell como JSON.sh o jsonv.sh para analizar JSON en bash, zsh o dash shell.
  3. JSON.awk , secuencia de comandos awk del analizador JSON.
  4. Módulos de Python como json.tool .
  5. subrayado-cli , Node.js y basado en javascript.

En este tutorial me estoy enfocando solo en jq , que es un analizador JSON bastante poderoso para shells con capacidad avanzada de filtrado y secuencias de comandos.

Impresión bonita JSON

Los datos JSON podrían estar en uno y casi ilegibles para los humanos, por lo que para que sea legible, aquí está la impresión bonita JSON.

Ejemplo: Un dato de jsonip.com , para obtener una dirección IP externa en formato JSON, use curl o wget herramientas como las siguientes.

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

Los datos reales se ven así:

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

Ahora imprímelo con jq:

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

Esto debería verse como a continuación, después de filtrar el resultado con jq.

{

   "ip": "111.222.333.444",

   "about": "/about",

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

}

Se podría hacer lo mismo con python json.tool módulo. Aquí hay un ejemplo:

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

Esta solución basada en Python debería estar bien para la mayoría de los usuarios, pero no es tan útil cuando Python no está preinstalado o no se pudo instalar, como en los sistemas integrados.

Sin embargo, el módulo json.tool python tiene una clara ventaja, es multiplataforma. Por lo tanto, puede usarlo sin problemas en Windows, Linux o Mac OS.

Lectura sugerida:

  • Prettyping:haga que la salida del comando Ping sea más bonita y fácil de leer

Cómo analizar JSON con jq

Primero, necesita instalar jq, ya está instalado en la mayoría de las distribuciones de GNU/Linux, instálelo con sus respectivos comandos de instalación de paquetes.

En Arch Linux:

$ sudo pacman -S jq

En Debian, Ubuntu, Linux Mint:

$ sudo apt-get install jq

En Fedora:

$ sudo dnf install jq

En openSUSE:

$ sudo zypper install jq

Para otros sistemas operativos o plataformas, consulte las instrucciones de instalación oficiales.

Filtros básicos e identificadores de jq

jq podría leer los datos JSON desde stdin o un archivo . Tienes que usar ambos dependiendo de la situación.

El único símbolo de . es el filtro más básico. Estos filtros también se denominan índice de identificador de objeto . Usando un solo . junto con jq básicamente imprime bastante el archivo JSON de entrada.

Comillas simples - No tienes que usar la comilla simple siempre. Pero si está combinando varios filtros en una sola línea, entonces debe usarlos.

Comillas dobles - Tienes que incluir cualquier carácter especial como @ , # , $ dentro de dos comillas dobles, como este ejemplo, jq .foo."@bar"

Impresión de datos sin procesar - Por cualquier motivo, si solo necesita los datos analizados finales, no encerrados entre comillas dobles, use el indicador -r con el comando jq, así. - jq -r .foo.bar .

Análisis de datos específicos

Para filtrar una parte específica de JSON, debe buscar en la jerarquía de datos del archivo JSON bastante impreso.

Un ejemplo de datos JSON, de 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"

  }

}

Voy a usar estos datos JSON como ejemplo en este tutorial, lo guardé como sample.json .

Digamos que quiero filtrar la dirección del archivo sample.json. Entonces el comando debería ser como:

$ jq .address sample.json

Salida de muestra:

{

  "streetAddress": "21 2nd Street",

  "city": "New York",

  "state": "NY",

  "postalCode": "10021"

}

Nuevamente, digamos que quiero el código postal, luego debo agregar otro índice de identificador de objeto , es decir, otro filtro.

$ cat sample.json | jq .address.postalCode

También tenga en cuenta que los filtros distinguen entre mayúsculas y minúsculas y debe usar exactamente la misma cadena para obtener un resultado significativo en lugar de nulo.

Análisis de elementos de una matriz JSON

Los elementos de la matriz JSON están encerrados entre corchetes, sin duda bastante versátiles de usar.

Para analizar elementos de una matriz, debe usar el []identificador junto con otro índice de identificador de objetos.

En esta muestra de datos JSON, los números de teléfono se almacenan dentro de una matriz, para obtener todo el contenido de esta matriz, debe usar solo los corchetes, como este ejemplo.

$ jq .phoneNumber[] sample.json

Digamos que solo quiere el primer elemento de la matriz, luego use los números de objeto de la matriz que comienzan con 0, para el primer elemento, use [0] , para los siguientes elementos, debe incrementarse en uno en cada paso.

$ jq .phoneNumber[0] sample.json

Ejemplos de secuencias de comandos

Digamos que solo quiero el número para el hogar, no todos los datos de la matriz JSON. Aquí es cuando las secuencias de comandos dentro del comando jq resultan útiles.

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

Aquí, primero estoy canalizando los resultados de un archivador a otro, luego uso el atributo de selección para seleccionar un tipo particular de datos, y nuevamente canalizo el resultado a otro filtro.

Explicar cada tipo de filtros jq y secuencias de comandos está más allá del alcance y el propósito de este tutorial. Se recomienda encarecidamente leer el manual de JQ para una mejor comprensión que se proporciona a continuación.


Linux
  1. Cómo programar con Bash:Sintaxis y herramientas

  2. Cómo encontrar archivos con permisos SUID y SGID en Linux

  3. Flatpak en Linux:qué es y cómo instalar aplicaciones con él

  4. Cómo comprimir archivos y directorios en Linux (con ejemplos)

  5. Cómo imprimir bastante el archivo JSON en la terminal de Linux

Cómo comparar comandos y programas de Linux desde la línea de comandos

Cómo compartir archivos de forma segura desde la línea de comandos con ffsend en Linux

Cómo ver el uso del disco con Duf en Linux y Unix

Cómo hacer una copia de seguridad y restaurar el sistema Linux con Timeshift

Cómo trabajar con procesos en primer plano y en segundo plano en Linux

Cómo eliminar archivos y directorios usando la línea de comandos de Linux