Herramienta de salida de formato Json aprendizaje de uso de jq

jqEs una herramienta de línea de comandos para procesar datos JSON. Puede ayudarle a formatear, consultar, filtrar, editar y otros datos JSON complejos para procesar y analizar mejor los datos.

1. Instalación

1.1 Instalación del paquete yum

$ yum install jq
No match for argument: jq
Error: Unable to find a match: jq

El paquete no se encontró en la configuración de la máquina yum source.

1.2 Instalar usando el paquete rpm

Instalación del paquete de descarga comunitaria:

Direcciones de paquetes comunitarios de Linux de uso común:https://centos.pkgs.org/

$ wget http://www6.atomicorp.com/channels/atomic/centos/7/x86_64/RPMS/jq-1.6-2.el7.x86_64.rpm

$ rpm -ivh jq-1.6-2.el7.x86_64.rpm 
warning: jq-1.6-2.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 4520afa9: NOKEY
error: Failed dependencies:
	libonig.so.5()(64bit) is needed by jq-1.6-2.el7.x86_64

Se informa el error de instalación, faltan dependencias y la instalación de las dependencias aún falla:

$ yum localinstall oniguruma-devel-6.8.2-2.el7.x86_64.rpm 
Last metadata expiration check: 0:07:38 ago on Tue 27 Jun 2023 10:15:12 AM CST.
Error: 
 Problem: conflicting requests
  - nothing provides libonig.so.5()(64bit) needed by oniguruma-devel-6.8.2-2.el7.x86_64

Instale usando la herramienta de liberación atómica:

$ wget http://www6.atomicorp.com/channels/atomic/centos/7/x86_64/RPMS/atomic-release-1.0-23.el7.art.noarch.rpm

$ rpm -Uvh atomic-release-1.0-23.el7.art.noarch.rpm 
warning: atomic-release-1.0-23.el7.art.noarch.rpm: Header V4 RSA/SHA256 Signature, key ID 4520afa9: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:atomic-release-1.0-23.el7.art    ################################# [100%]

# 安装atomic-release实际上是在本地新建atomic.repo yum源文件
$ ll /etc/yum.repos.d/ | grep atomic
-rw-r--r--  1 root root  743 Jan  5  2022 atomic.repo

$ yum install jq
CentOS / Red Hat Enterprise Linux 7 - atomic                                                                                                 80 kB/s | 205 kB     00:02    
Last metadata expiration check: 0:00:00 ago on Tue 27 Jun 2023 10:28:38 AM CST.
Dependencies resolved.
============================================================================================================================================================================
 Package                                   Arch                                   Version                                      Repository                              Size
============================================================================================================================================================================
Installing:
 jq                                        x86_64                                 1.6-2.el7                                    atomic                                 167 k
Installing dependencies:
 oniguruma                                 x86_64                                 6.8.2-1.el7                                  atomic                                 181 k

Transaction Summary
============================================================================================================================================================================
Install  2 Packages

Total download size: 348 k
Installed size: 1.0 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): oniguruma-6.8.2-1.el7.x86_64.rpm                                                                                                      90 kB/s | 181 kB     00:02    
(2/2): jq-1.6-2.el7.x86_64.rpm                                                                                                               83 kB/s | 167 kB     00:02    
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                       102 kB/s | 348 kB     00:03     
warning: /var/cache/dnf/atomic-e5cca8bbd0dce12d/packages/jq-1.6-2.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 4520afa9: NOKEY
Importing GPG key 0x4520AFA9:
 Userid     : "Atomicorp (Atomicorp Official Signing Key) <[email protected]>"
 Fingerprint: 1818 66DF 9DAC A40E 5B42 9B08 FFBD 5D0A 4520 AFA9
 From       : https://www.atomicorp.com/RPM-GPG-KEY.atomicorp.txt
Is this ok [y/N]: y
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                                                    1/1 
  Installing       : oniguruma-6.8.2-1.el7.x86_64                                                                                                                       1/2 
  Running scriptlet: oniguruma-6.8.2-1.el7.x86_64                                                                                                                       1/2 
  Installing       : jq-1.6-2.el7.x86_64                                                                                                                                2/2 
  Running scriptlet: jq-1.6-2.el7.x86_64                                                                                                                                2/2 
  Verifying        : jq-1.6-2.el7.x86_64                                                                                                                                1/2 
  Verifying        : oniguruma-6.8.2-1.el7.x86_64                                                                                                                       2/2 
New leaves:
  jq.x86_64

Installed:
  jq.x86_64 1.6-2.el7                                                              oniguruma.x86_64 6.8.2-1.el7                                                             

Complete!

2. jqSolicitud

2.1 Formatear datos json

Utilice jq para formatear datos JSON complejos en un formato más legible.
Por ejemplo, {"foo": 0}después de formatear con jq, se muestra como:

$ echo '{"foo": 0}' | jq
{
    
    
  "foo": 0
}

Operación sobre archivos:

$ cat test.json 
{
    
    "gender":"man","name":"zhangsan","age":"10","score":{
    
    "math":"85","English":"86","Chinese":"87"}}
$ jq . test.json 
{
    
    
  "gender": "man",
  "name": "zhangsan",
  "age": "10",
  "score": {
    
    
    "math": "85",
    "English": "86",
    "Chinese": "87"
  }
}

# 也可以
$ cat test.json | jq 
{
    
    
  "gender": "man",
  "name": "zhangsan",
  "age": "10",
  "score": {
    
    
    "math": "85",
    "English": "86",
    "Chinese": "87"
  }
}

2.2 Consultar datos JSON

Utilice jq para consultar un determinado campo o valor en datos JSON.

$ cat test.json | jq '.age'
"10"

# 查看math
$ cat test.json | jq '.score.math'
"85"

O usar:

$ jq '.age' test.json 
"10"

# 查看math
$ jq '.score.math' test.json
"85"

Consulta para múltiples conjuntos de datos, los datos son los siguientes:

$ cat test.json 
[{
    
    "gender":"man","name":"zhangsan","age":10,"score":{
    
    "math":85,"English":86,"Chinese":87}},{
    
    "gender":"man","name":"lisi","age":9,"score":{
    
    "math":80,"English":81,"Chinese":82}},{
    
    "gender":"man","name":"wangwu","age":11,"score":{
    
    "math":85,"English":84,"Chinese":87}},{
    
    "gender":"female","name":"lili","age":11,"score":{
    
    "math":85,"English":88,"Chinese":90}}]

$ cat test.json | jq  .
[
  {
    
    
    "gender": "man",
    "name": "zhangsan",
    "age": 10,
    "score": {
    
    
      "math": 85,
      "English": 86,
      "Chinese": 87
    }
  },
  {
    
    
    "gender": "man",
    "name": "lisi",
    "age": 9,
    "score": {
    
    
      "math": 80,
      "English": 81,
      "Chinese": 82
    }
  },
  {
    
    
    "gender": "man",
    "name": "wangwu",
    "age": 11,
    "score": {
    
    
      "math": 85,
      "English": 84,
      "Chinese": 87
    }
  },
  {
    
    
    "gender": "female",
    "name": "lili",
    "age": 11,
    "score": {
    
    
      "math": 85,
      "English": 88,
      "Chinese": 90
    }
  }
]
$ cat test.json |  jq '.[0]'
{
    
    
  "gender": "man",
  "name": "zhangsan",
  "age": 10,
  "score": {
    
    
    "math": 85,
    "English": 86,
    "Chinese": 87
  }
}

$ cat test.json |  jq '.[1]'
{
    
    
  "gender": "man",
  "name": "lisi",
  "age": 9,
  "score": {
    
    
    "math": 80,
    "English": 81,
    "Chinese": 82
  }
}

2.3 Filtrar datos JSON

Utilice jq para filtrar parte de los datos JSON según ciertas condiciones

$ cat test.json |  jq '.[] | select(.age > 10)'
{
    
    
  "gender": "man",
  "name": "wangwu",
  "age": 11,
  "score": {
    
    
    "math": 85,
    "English": 84,
    "Chinese": 87
  }
}
{
    
    
  "gender": "female",
  "name": "lili",
  "age": 11,
  "score": {
    
    
    "math": 85,
    "English": 88,
    "Chinese": 90
  }
}

$ cat test.json |  jq '.[] | select(.score.math < 85)'
{
    
    
  "gender": "man",
  "name": "lisi",
  "age": 9,
  "score": {
    
    
    "math": 80,
    "English": 81,
    "Chinese": 82
  }
}


$ cat test.json |  jq '.[] | select(.score.math < 80)'

2.4 Editar datos JSON

Ciertos campos o valores en datos JSON se pueden editar usando jq.

$ cat test.json | jq '.[0].age'
10

$ cat test.json | jq '.[0].age += 1'
[
  {
    
    
    "gender": "man",
    "name": "zhangsan",
    "age": 11,
    "score": {
    
    
      "math": 85,
      "English": 86,
      "Chinese": 87
    }
  },
  {
    
    
    "gender": "man",
    "name": "lisi",
    "age": 9,
    "score": {
    
    
      "math": 80,
      "English": 81,
      "Chinese": 82
    }
  },
  {
    
    
    "gender": "man",
    "name": "wangwu",
    "age": 11,
    "score": {
    
    
      "math": 85,
      "English": 84,
      "Chinese": 87
    }
  },
  {
    
    
    "gender": "female",
    "name": "lili",
    "age": 11,
    "score": {
    
    
      "math": 85,
      "English": 88,
      "Chinese": 90
    }
  }
]

$ cat test.json 
[{
    
    "gender":"man","name":"zhangsan","age":10,"score":{
    
    "math":85,"English":86,"Chinese":87}},{
    
    "gender":"man","name":"lisi","age":9,"score":{
    
    "math":80,"English":81,"Chinese":82}},{
    
    "gender":"man","name":"wangwu","age":11,"score":{
    
    "math":85,"English":84,"Chinese":87}},{
    
    "gender":"female","name":"lili","age":11,"score":{
    
    "math":85,"English":88,"Chinese":90}}]

Cabe señalar que el archivo original no ha sido modificado.

3. Otros usos

3.1 Carácter de tubería|

Usando |operadores podemos combinar dos filtros. Funciona de manera similar al carácter de tubería en los sistemas Unix. La salida del filtro de la izquierda pasa al filtro de la derecha.

3.2 keysFunción

La función de claves obtiene todas las claves del objeto JSON. La función de claves devuelve una lista que contiene los nombres de todas las claves en el objeto JSON. El índice de datos obtenido para múltiples conjuntos de datos es el siguiente:

$ cat test.json | jq '. | keys'
[
  0,
  1,
  2,
  3
]

Obtener un determinado conjunto de claves de datos

$ cat test.json | jq '.[0] | keys'
[
  "age",
  "gender",
  "name",
  "score"
]

$ cat test.json | jq '.[0].score | keys'
[
  "Chinese",
  "English",
  "math"
]

3.3 lengthFunción

Devuelve la longitud de una matriz o cadena.

$ cat test.json | jq '. | length'
4

$ cat test.json | jq '.[0] | length'
4

$ cat test.json | jq '.[0].score | length'
3

$ cat test.json | jq '.[0].name | length'
8

3.4 mapFunción

Ejecute una función en cada elemento de una matriz y devuelva una nueva matriz.

$ cat test.json | jq '. | map(keys)'
[
  [
    "age",
    "gender",
    "name",
    "score"
  ],
  [
    "age",
    "gender",
    "name",
    "score"
  ],
  [
    "age",
    "gender",
    "name",
    "score"
  ],
  [
    "age",
    "gender",
    "name",
    "score"
  ]
]

$ cat test.json | jq '. | map(length)'
[
  4,
  4,
  4,
  4
]

3.5 selectFunción

Filtra cada elemento de una matriz y devuelve una nueva matriz.
Referencia 2.3

3.6 if-then-elseDeclaración

if-then-elseDeclaraciones para realizar diferentes operaciones en función de las condiciones. La sintaxis es la siguiente:

if CONDITION then EXPRESSION1 else EXPRESSION2 end

CONDITION es una expresión condicional, que puede ser una expresión de comparación, lógica o de otro tipo. Si la CONDICIÓN es verdadera, se ejecuta la EXPRESIÓN1; de lo contrario, se ejecuta la EXPRESIÓN2. EXPRESSION1 y EXPRESSION2 pueden ser cualquier expresión jq, incluidas llamadas a funciones, referencias de variables, operaciones matemáticas, etc.

$ cat test.json | jq '.[0].name= if .[0].age >5 then "first" else "second" end'
[
  {
    
    
    "gender": "man",
    "name": "first",
    "age": 10,
    "score": {
    
    
      "math": 85,
      "English": 86,
      "Chinese": 87
    }
  },
  {
    
    
    "gender": "man",
    "name": "lisi",
    "age": 9,
    "score": {
    
    
      "math": 80,
      "English": 81,
      "Chinese": 82
    }
  },
  {
    
    
    "gender": "man",
    "name": "wangwu",
    "age": 11,
    "score": {
    
    
      "math": 85,
      "English": 84,
      "Chinese": 87
    }
  },
  {
    
    
    "gender": "female",
    "name": "lili",
    "age": 11,
    "score": {
    
    
      "math": 85,
      "English": 88,
      "Chinese": 90
    }
  }
]

3.7 joinFunción

Concatena todos los elementos de una matriz en una cadena. La función oin solo se puede usar para matrices de cadenas, no para otros tipos de matrices.
test01.json

{
    
    
  "name": "Alice",
  "hobbies": ["reading", "singing", "dancing"]
}
cat test01.json | jq '.hobbies | join(",")'
"reading,singing,dancing"

3.8 splitFunción

Divida una cadena en subcadenas y guárdelas en una matriz.

$ cat test.json | jq '.[0].name | split("")'
[
  "z",
  "h",
  "a",
  "n",
  "g",
  "s",
  "a",
  "n"
]

$ cat test.json | jq '.[0].name | split("n")'
[
  "zha",
  "gsa",
  ""
]

3.9 max和minFunción

Devuelve el valor máximo o mínimo en una matriz o conjunto de números

$ cat test.json | jq '. | map(.score.math) | max'
85

$ cat test.json | jq '. | map(.score.math) | min'
80

$ cat test.json | jq '. | map(.age) | max'
11

3.10 flattenFunción

Convertir una matriz multidimensional en una matriz unidimensional

test02.json

$ cat test02.json 
[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]
$ cat test02.json | jq '. | flatten'
[
  1,
  2,
  3,
  4,
  5,
  6,
  7,
  8,
  9
]

3.11 sortFunción

Ordenar elementos en una matriz

$ cat test.json | jq '. | map(.age) | sort'
[
  9,
  10,
  11,
  11
]

$ cat test.json | jq '. | map(.score.Chinese) | sort'
[
  82,
  87,
  87,
  90
]

3.12 group_byFunción

Agrupar elementos en una matriz según una clave.

# 依据age分组
$ cat test.json | jq 'group_by(.age)'
[
  [
    {
    
    
      "gender": "man",
      "name": "lisi",
      "age": 9,
      "score": {
    
    
        "math": 80,
        "English": 81,
        "Chinese": 82
      }
    }
  ],
  [
    {
    
    
      "gender": "man",
      "name": "zhangsan",
      "age": 10,
      "score": {
    
    
        "math": 85,
        "English": 86,
        "Chinese": 87
      }
    }
  ],
  [
    {
    
    
      "gender": "man",
      "name": "wangwu",
      "age": 11,
      "score": {
    
    
        "math": 85,
        "English": 84,
        "Chinese": 87
      }
    },
    {
    
    
      "gender": "female",
      "name": "lili",
      "age": 11,
      "score": {
    
    
        "math": 85,
        "English": 88,
        "Chinese": 90
      }
    }
  ]
]

3.13 uniqueFunción

Se utiliza para eliminar elementos duplicados de los datos de entrada.

test03.json

$ cat test03.json 
[1, 2, 3, 1, 2, 4, 5, 3]
$ cat test03.json | jq '. | unique'
[
  1,
  2,
  3,
  4,
  5
]

3.14 to_entries和from_entriesFunción

Convierte un objeto en una matriz de pares clave-valor, o una matriz de pares clave-valor en un objeto.

$ cat test.json | jq '.[0] |to_entries'
[
  {
    
    
    "key": "gender",
    "value": "man"
  },
  {
    
    
    "key": "name",
    "value": "zhangsan"
  },
  {
    
    
    "key": "age",
    "value": 10
  },
  {
    
    
    "key": "score",
    "value": {
    
    
      "math": 85,
      "English": 86,
      "Chinese": 87
    }
  }
]

prueba04.json

$ cat test04.json 
[
  {
    
    
    "key": "gender",
    "value": "man"
  },
  {
    
    
    "key": "name",
    "value": "zhangsan"
  },
  {
    
    
    "key": "age",
    "value": 10
  },
  {
    
    
    "key": "score",
    "value": {
    
    
      "math": 85,
      "English": 86,
      "Chinese": 87
    }
  }
]
$ cat test04.json | jq '. |from_entries'
{
    
    
  "gender": "man",
  "name": "zhangsan",
  "age": 10,
  "score": {
    
    
    "math": 85,
    "English": 86,
    "Chinese": 87
  }
}

3.15 containsFunción

Comprobar si una matriz contiene un elemento específico

$ cat test.json | jq '.[0].name | contains("z")'
true

$ cat test.json | jq '.[0].name | contains("l")'
false

3.16 startswith和endswithFunción

Comprobar si una cadena comienza o termina con un prefijo o sufijo específico

$ cat test.json | jq '.[0].name | startswith("zh")'
true

$ cat test.json | jq '.[0].name | startswith("li")'
false

$ cat test.json | jq '.[0].name | endswith("san")'
true

$ cat test.json | jq '.[0].name | endswith("hua")'
false

Documentación de referencia

1. https://mp.weixin.qq.com/s/U1VwJGFVkrUyv3jMegapCg

2, https://mp.weixin.qq.com/s/45-ztTx2scbNY5u7NQzeIA

3, https://www.cnblogs.com/FunTester/p/14713957.html

4、https://blog.csdn.net/w727655308/article/details/121207345

Supongo que te gusta

Origin blog.csdn.net/yuelai_217/article/details/131533266
Recomendado
Clasificación