#1 Le 04/05/2022, à 21:36
- PowaBanga
Command jq : pour lire un json
Salut à tous, j'essaye d'apprendre à extraire les données d'un json en bash, et j'ai donc trouvé la command "jq" !
je m'entraine pour cela sur la commande sensor :
$ sensors -j 3 ↵
{
"soc_dts1-virtual-0":{
"Adapter": "Virtual device",
"temp1":{
"temp1_input": 48.000
}
},
"acpitz-acpi-0":{
"Adapter": "ACPI interface",
"temp1":{
"temp1_input": 41.900,
"temp1_crit": 100.000
}
},
"axp288_fuel_gauge-isa-0000":{
"Adapter": "ISA adapter",
"in0":{
"in0_input": 3.608
},
"curr1":{
"curr1_input": 0.000
}
},
"coretemp-isa-0000":{
"Adapter": "ISA adapter",
"Core 0":{
"temp2_input": 49.000,
"temp2_max": 90.000,
"temp2_crit": 90.000,
"temp2_crit_alarm": 0.000
},
"Core 1":{
"temp3_input": 48.000,
"temp3_max": 90.000,
"temp3_crit": 90.000,
"temp3_crit_alarm": 0.000
},
"Core 2":{
"temp4_input": 49.000,
"temp4_max": 90.000,
"temp4_crit": 90.000,
"temp4_crit_alarm": 0.000
},
"Core 3":{
"temp5_input": 48.000,
"temp5_max": 90.000,
"temp5_crit": 90.000,
"temp5_crit_alarm": 0.000
}
},
"soc_dts0-virtual-0":{
"Adapter": "Virtual device",
"temp1":{
"temp1_input": 49.000
}
}
}
J'aimerais donc récupérer la valeur de "temp1_input" qui est dans "soc_dts1-virtual-0"
mais voici mon résulta :
$ sensors -j | jq '.soc_dts0-virtual-0'
jq: error: virtual/0 is not defined at <top-level>, line 1:
.soc_dts0-virtual-0
jq: 1 compile error
$ sensors -j | jq '.soc_dts0-virtual-0.temp1'
jq: error: syntax error, unexpected IDENT, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.soc_dts0-virtual-0.temp1
jq: 1 compile error
$ sensors -j | jq '.soc_dts0-virtual-0.temp1.temp1_input'
jq: error: syntax error, unexpected IDENT, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.soc_dts0-virtual-0.temp1.temp1_input
jq: 1 compile error
Pourtant d'après ce que j'ai lu ca devrais au moin afficher un truc...
il n'y a que " | jq '.' " qui m'affiche quelque chose en fait...
Hors ligne
#2 Le 04/05/2022, à 21:59
- beuguissime
Re : Command jq : pour lire un json
Salut,
Par exemple,
sensors -j | jq '."soc_dts1-virtual-0"'
sensors -j | jq '."soc_dts1-virtual-0".temp1.temp1_input'
Hors ligne
#3 Le 04/05/2022, à 22:07
- Watael
Re : Command jq : pour lire un json
salut,
c'est les tirets
$ sensors -j | jq '."soc_dts0-virtual-0"'
je n 'avais jamais vu ça.
edit : grilled
Dernière modification par Watael (Le 04/05/2022, à 22:07)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 05/05/2022, à 07:30
- iznobe
Re : Command jq : pour lire un json
Bonjour , juste par curiosité , j ' ai pas compris l' histoire des tirets ...
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#5 Le 05/05/2022, à 11:18
- beuguissime
Re : Command jq : pour lire un json
Les tirets sont des caractères « interdits » pour le nom d'un champ du moins du point de vue de jq, donc il faut les protéger par des guillemets doubles droits et protéger l'ensemble par des guillemets simples droits.
Dernière modification par beuguissime (Le 05/05/2022, à 11:19)
Hors ligne
#6 Le 05/05/2022, à 12:15
- iznobe
Re : Command jq : pour lire un json
Les tirets sont des caractères « interdits » pour le nom d'un champ du moins du point de vue de jq, donc il faut les protéger par des guillemets doubles droits et protéger l'ensemble par des guillemets simples droits.
Bonjour et merci pour l' explication , je comprends mieux effectivement la transformation de la ligne de commande .
Merci a toi
il s' agit du tiret du 8 ( underscore ) ou bien du signe moins de la touche 6 ?
Dernière modification par iznobe (Le 05/05/2022, à 12:16)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#7 Le 05/05/2022, à 12:27
- beuguissime
Re : Command jq : pour lire un json
salut,
Voici quelques tests car je ne savais pas plus précisément.
Ça ne concerne pas le caractère souligné mais ça concerne d'autres caractères (comme les lettres accentuées) :
$ echo '{"hello": "bye", "au-revoir": "bonjour", "buongiorno_": "ciao", "hallo007": "tschüß", "tschüss!": "Grüss Gott!"}' | jq .
{
"hello": "bye",
"au-revoir": "bonjour",
"buongiorno_": "ciao",
"hallo007": "tschüß",
"tschüss!": "Grüss Gott!"
}
$ echo '{"hello": "bye", "au-revoir": "bonjour", "buongiorno_": "ciao", "hallo007": "tschüß", "tschüss!": "Grüss Gott!"}' | jq .hello
"bye"
$ echo '{"hello": "bye", "au-revoir": "bonjour", "buongiorno_": "ciao", "hallo007": "tschüß", "tschüss!": "Grüss Gott!"}' | jq .au-revoir
jq: error: revoir/0 is not defined at <top-level>, line 1:
.au-revoir
jq: 1 compile error
$ echo '{"hello": "bye", "au-revoir": "bonjour", "buongiorno_": "ciao", "hallo007": "tschüß", "tschüss!": "Grüss Gott!"}' | jq .buongiorno_
"ciao"
$ echo '{"hello": "bye", "au-revoir": "bonjour", "buongiorno_": "ciao", "hallo007": "tschüß", "tschüss!": "Grüss Gott!"}' | jq .hallo007
"tschüß"
$ echo '{"hello": "bye", "au-revoir": "bonjour", "buongiorno_": "ciao", "hallo007": "tschüß", "tschüss!": "Grüss Gott!"}' | jq .tschüss!
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.tschüss!
jq: 1 compile error
$ echo '{"hello": "bye", "au-revoir": "bonjour", "buongiorno_": "ciao", "hallo007": "tschüß", "tschüss!": "Grüss Gott!"}' | jq '."au-revoir"'
"bonjour"
$ echo '{"hello": "bye", "au-revoir": "bonjour", "buongiorno_": "ciao", "hallo007": "tschüß", "tschüss!": "Grüss Gott!"}' | jq '."tschüss!"'
"Grüss Gott!"
Hors ligne
#8 Le 05/05/2022, à 13:33
- bruno
Re : Command jq : pour lire un json
If the key contains special characters, you need to surround it with double quotes like this: ."foo$", or else .["foo$"].