Je ne peux utiliser aucune des réponses ici. Pas de jq disponible, pas de tableaux de shell, pas de déclaration, pas de grep -P, pas de lookbehind et lookahead, pas de Python, pas de Perl, pas de Ruby, non - pas même Bash ... Les réponses restantes ne fonctionnent tout simplement pas bien. JavaScript semblait familier, mais l'étain dit Nescaffe - donc c'est non plus :) Même si disponible, pour mon simple besoin - ils seraient exagérés et lents.
Pourtant, il est extrêmement important pour moi d'obtenir de nombreuses variables de la réponse au format json de mon modem. Je le fais dans un sh avec BusyBox très coupé vers le bas à mes routeurs! Aucun problème en utilisant awk seul: il suffit de définir des délimiteurs et de lire les données. Pour une seule variable, c'est tout!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
Rappelez-vous que je n'ai pas de tableaux? J'ai dû affecter dans les données analysées awk aux 11 variables dont j'ai besoin dans un script shell. Partout où je regardais, c'était une mission impossible. Pas de problème avec ça aussi.
Ma solution est simple. Ce code va: 1) analyser le fichier .json de la question (en fait, j'ai emprunté un échantillon de données de travail à la réponse la plus votée) et sélectionner les données citées, plus 2) créer des variables de shell à l'intérieur de l'awk en attribuant un shell nommé gratuit noms de variables.
eval $( curl -s 'https://api.github.com/users/lambda' |
awk ' BEGIN { FS="\""; RS="," };
{
if ($2 == "login") { print "Login=\""$4"\"" }
if ($2 == "name") { print "Name=\""$4"\"" }
if ($2 == "updated_at") { print "Updated=\""$4"\"" }
}' )
echo "$Login, $Name, $Updated"
Aucun problème avec les blancs à l'intérieur. Dans mon utilisation, la même commande analyse une sortie longue ligne unique. Comme eval est utilisé, cette solution convient uniquement aux données fiables. Il est simple de l'adapter à la collecte de données non cotées. Pour un grand nombre de variables, un gain de vitesse marginal peut être obtenu en utilisant else if. Manque de tableau signifie évidemment: pas d'enregistrements multiples sans bidouilles supplémentaires. Mais là où des baies sont disponibles, l'adaptation de cette solution est une tâche simple.
@maikel sed répond presque fonctionne (mais je ne peux pas en parler). Pour mes données bien formatées - cela fonctionne. Pas tellement avec l'exemple utilisé ici (les guillemets manquants le jettent). C'est compliqué et difficile à modifier. De plus, je n'aime pas avoir à faire 11 appels pour extraire 11 variables. Pourquoi? J'ai chronométré 100 boucles en extrayant 9 variables: la fonction sed a pris 48,99 secondes et ma solution a pris 0,91 secondes! Pas juste? Faire une seule extraction de 9 variables: 0,51 contre 0,02 s.