Ich kann hier keine der Antworten verwenden. Kein verfügbares JQ, keine Shell-Arrays, kein Deklarieren, kein Grep-P, kein Lookbehind und Lookahead, kein Python, kein Perl, kein Ruby, nein - nicht einmal Bash ... Die verbleibenden Antworten funktionieren einfach nicht gut. JavaScript kam mir bekannt vor, aber in der Dose steht Nescaffe - also ist es auch ein No-Go :) Selbst wenn es für meine einfache Notwendigkeit verfügbar wäre, wären sie übertrieben und langsam.
Für mich ist es jedoch äußerst wichtig, viele Variablen aus der json-formatierten Antwort meines Modems zu erhalten. Ich mache es in einem Sh mit sehr abgespeckten BusyBox an meinen Routern! Keine Probleme mit awk alleine: Setzen Sie einfach Trennzeichen und lesen Sie die Daten. Für eine einzelne Variable ist das alles!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
Erinnerst du dich, dass ich keine Arrays habe? Ich musste innerhalb der awk-analysierten Daten den 11 Variablen zuweisen, die ich in einem Shell-Skript benötige. Wo immer ich hinschaute, wurde gesagt, dass dies eine unmögliche Mission sei. Auch damit kein Problem.
Meine Lösung ist einfach. Dieser Code wird: 1) die .json-Datei aus der Frage analysieren (tatsächlich habe ich ein Arbeitsdatenbeispiel aus der am besten bewerteten Antwort ausgeliehen) und die zitierten Daten auswählen, plus 2) Shell-Variablen aus der awk erstellen, die eine frei benannte Shell zuweisen Variablennamen.
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"
Keine Probleme mit Rohlingen. Bei meiner Verwendung analysiert derselbe Befehl eine lange einzeilige Ausgabe. Da eval verwendet wird, ist diese Lösung nur für vertrauenswürdige Daten geeignet. Es ist einfach, es anzupassen, um nicht zitierte Daten aufzunehmen. Für eine große Anzahl von Variablen kann eine marginale Geschwindigkeitsverstärkung mit else if erreicht werden. Das Fehlen eines Arrays bedeutet offensichtlich: Keine Mehrfachaufzeichnungen ohne zusätzliches Fummeln. Wenn jedoch Arrays verfügbar sind, ist die Anpassung dieser Lösung eine einfache Aufgabe.
@maikel sed Antwort funktioniert fast (aber ich kann es nicht kommentieren). Für meine schön formatierten Daten funktioniert es. Nicht so sehr mit dem hier verwendeten Beispiel (fehlende Anführungszeichen werfen es ab). Es ist kompliziert und schwer zu modifizieren. Außerdem muss ich nicht gerne 11 Aufrufe tätigen, um 11 Variablen zu extrahieren. Warum? Ich habe 100 Schleifen zeitlich festgelegt, um 9 Variablen zu extrahieren: Die sed-Funktion dauerte 48,99 Sekunden und meine Lösung 0,91 Sekunden! Nicht fair? Nur eine einzige Extraktion von 9 Variablen: 0,51 vs. 0,02 Sek.