Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/05/2022, à 22: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, à 22: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, à 23:07

Watael

Re : Command jq : pour lire un json

salut,

c'est les tirets yikes

$ sensors -j | jq '."soc_dts0-virtual-0"'

je n 'avais jamais vu ça.

edit : grilled

Dernière modification par Watael (Le 04/05/2022, à 23:07)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 05/05/2022, à 08:30

iznobe

Re : Command jq : pour lire un json

Bonjour , juste par curiosité , j ' ai pas compris l' histoire des tirets ...


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#5 Le 05/05/2022, à 12: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, à 12:19)

Hors ligne

#6 Le 05/05/2022, à 13:15

iznobe

Re : Command jq : pour lire un json

beuguissime a écrit :

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 wink

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, à 13:16)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#7 Le 05/05/2022, à 13: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, à 14:33

bruno

Re : Command jq : pour lire un json

man jq a écrit :

If the key contains special characters, you need to surround it with double quotes like this: ."foo$", or else .["foo$"].

Hors ligne