2017-09-28 1 views
0

salut je suis écrit un petit script shell. J'utilise la commande curl pour appeler api. ce qu'il retourne est un statut d'un balayage.comment obtenir une valeur à partir d'une paire de valeurs clé json dans un script shell Linux

{"status":"14"} 

Je veux obtenir ce statut et vérifier s'il est inférieur à 100; c'est ce que j'ai fait jusqu'à présent

a=0 

    while [ $a -lt 100 ] 
    do 

     curlout=$(curl "http://localhost:9090/JSON/spider/view/status/?zapapiformat=JSON&scanId=0"); 
     echo "$curlout"; 
     a=`expr $a + 1` 
    done 

ce que je veux faire est d'assigner ce statut à $ a; comment lire ce json pour obtenir la valeur dans le script shell

+0

'sed -r «/état/s /^.* "([0-9] +). * $/\ 1/'<<< "$ curlout" 'travaillé pour vous? – CWLiu

+0

' echo' {"status": "14"} '| tr -cd' 0-9 \ n''? – Cyrus

+1

poster la sortie de 'curl 'http: // localhost: 9090/JSON/spider/view/état /? zapapiformat = JSON & scanId = 0" '. Et quel est le but de l'incrémentation de la valeur de' status' si c'est toujours statique? – RomanPerekhrest

Répondre

3

Si vous avez besoin de travailler avec JSON, vous devriez obtenir jq:

$ echo '{"status": "14"}' | jq '.status|tonumber' 
14 

ou moins rigoureuse:

$ echo '{"status": "14"}' | jq -r '.status' 
14 
0

Si vous êtes sûr du format de la sortie curl, alors c'est très simple.

echo "$curlout" | tr -cd '[:digit:]' 

De manpage de tr,

-c, -C, --complement 
      use the complement of SET1 

    -d, --delete 
      delete characters in SET1, do not translate 

    [:digit:] 
      all digits 

Donc, cette commande supprime tous les caractères autres que des chiffres.