jq
Es 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. jq
Solicitud
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 keys
Funció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 length
Funció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 map
Funció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 select
Función
Filtra cada elemento de una matriz y devuelve una nueva matriz.
Referencia 2.3
3.6 if-then-else
Declaración
if-then-else
Declaraciones 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 join
Funció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 split
Funció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和min
Funció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 flatten
Funció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 sort
Funció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_by
Funció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 unique
Funció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_entries
Funció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 contains
Funció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和endswith
Funció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