Ich versuche, JSON zu analysieren, das von einer Curl-Anfrage zurückgegeben wurde, wie folgt:
curl 'http://twitter.com/users/username.json' |
sed -e 's/[{}]/''/g' |
awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'
Das obige teilt den JSON in Felder auf, zum Beispiel:
% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...
Wie drucke ich ein bestimmtes Feld (gekennzeichnet durch -v k=text
)?
grep -Po '"'"version"'"\s*:\s*"\K([^"]*)' package.json
. Dies löst die Aufgabe einfach und nur mit grep und funktioniert perfekt für einfache JSONs. Für komplexe JSONs sollten Sie einen geeigneten Parser verwenden.Antworten:
Es gibt eine Reihe von Tools, die speziell für die Bearbeitung von JSON über die Befehlszeile entwickelt wurden und viel einfacher und zuverlässiger sind als Awk, z. B
jq
.:Sie können dies auch mit Tools tun, die wahrscheinlich bereits auf Ihrem System installiert sind, wie z. B. Python, das das
json
Modul verwendet , und so zusätzliche Abhängigkeiten vermeiden, während Sie dennoch den Vorteil eines geeigneten JSON-Parsers haben. Im Folgenden wird davon ausgegangen, dass Sie UTF-8 verwenden möchten, in dem der ursprüngliche JSON-Code codiert sein sollte und das auch von den meisten modernen Terminals verwendet wird:Python 3:
Python 2:
Historische Notizen
Diese Antwort empfahl ursprünglich jsawk , das zwar immer noch funktionieren sollte, aber etwas umständlicher zu verwenden ist als
jq
und von der Installation eines eigenständigen JavaScript-Interpreters abhängt, der weniger verbreitet ist als ein Python-Interpreter. Daher sind die obigen Antworten wahrscheinlich vorzuziehen:Diese Antwort verwendete ursprünglich auch die Twitter-API aus der Frage, aber diese API funktioniert nicht mehr, was es schwierig macht, die Beispiele zum Testen zu kopieren, und die neue Twitter-API erfordert API-Schlüssel, daher habe ich auf die Verwendung der GitHub-API umgestellt, die kann leicht ohne API-Schlüssel verwendet werden. Die erste Antwort auf die ursprüngliche Frage wäre:
quelle
print
Anweisung immer in ASCII codiert wird , wenn Sie die Ausgabe an einen anderen Befehl weiterleiten, da Sie Python in einer Pipe verwenden. Fügen SiePYTHONIOENCODING=<desired codec>
in den Befehl ein, um eine andere Ausgabecodierung festzulegen, die für Ihr Terminal geeignet ist. In Python 3 ist in diesem Fall der Standardwert UTF-8 (mithilfe derprint()
Funktion ).curl -s
ist äquivalent zucurl --silent
, währendjq -r
bedeutetjq --raw-output
dh ohne Anführungszeichen.Um die Werte für einen bestimmten Schlüssel schnell zu extrahieren, verwende ich persönlich gerne "grep -o", das nur die Übereinstimmung des regulären Ausdrucks zurückgibt. Zum Beispiel, um das "Text" -Feld aus Tweets zu erhalten, etwa:
Diese Regex ist robuster als Sie vielleicht denken; Beispielsweise werden Zeichenfolgen mit eingebetteten Kommas und Anführungszeichen gut behandelt. Ich denke, mit etwas mehr Arbeit könnten Sie eine machen, die tatsächlich garantiert den Wert extrahiert, wenn sie atomar ist. (Wenn es verschachtelt ist, kann ein Regex das natürlich nicht.)
Und um weiter zu reinigen (obwohl das Original der Saite erhalten bleibt), können Sie Folgendes verwenden :
| perl -pe 's/"text"://; s/^"//; s/",$//'
. (Ich habe dies für diese Analyse getan .)Für alle Hasser, die darauf bestehen, dass Sie einen echten JSON-Parser verwenden - ja, das ist für die Korrektheit unerlässlich, aber
grep -o
ist um Größenordnungen schneller als die Python-Standardbibliothekjson
, zumindest wenn dies für Tweets durchgeführt wird (die jeweils ~ 2 KB groß sind). Ich bin mir nicht sicher, ob dies nur deshalbjson
so langsam ist (ich sollte es irgendwann mit yajl vergleichen). Im Prinzip sollte ein Regex jedoch schneller sein, da er endlich ist und viel besser optimiert werden kann, anstatt eines Parsers, der die Rekursion unterstützen muss, und in diesem Fall viele CPU-Gebäudebäume für Strukturen ausgibt, die Sie nicht interessieren. (Wenn jemand einen Finite-State-Transducer geschrieben hätte, der eine ordnungsgemäße (tiefenbegrenzte) JSON-Analyse durchgeführt hat, wäre das fantastisch! In der Zwischenzeit haben wir "grep -o".)Um wartbaren Code zu schreiben, verwende ich immer eine echte Parsing-Bibliothek. Ich habe jsawk noch nicht ausprobiert , aber wenn es gut funktioniert, würde das Punkt 1 ansprechen.
Eine letzte, verrücktere Lösung: Ich habe ein Skript geschrieben, das Python verwendet
json
und die gewünschten Schlüssel in durch Tabulatoren getrennte Spalten extrahiert. dann leite ich einen Wrapper umawk
, der den benannten Zugriff auf Spalten ermöglicht. Hier: die Skripte json2tsv und tsvawk . Für dieses Beispiel wäre es also:Dieser Ansatz geht nicht auf Nummer 2 ein, ist ineffizienter als ein einzelnes Python-Skript und ein wenig spröde: Er erzwingt die Normalisierung von Zeilenumbrüchen und Tabulatoren in Zeichenfolgenwerten, um mit der durch Felder / Datensätze getrennten Weltansicht von awk gut zu spielen. Damit können Sie jedoch korrekter als in der Befehlszeile bleiben
grep -o
.quelle
grep -Po '"text":(\d*?,|.*?[^\\]",)'
jq .name
arbeitet in der Befehlszeile und erfordert nicht "Öffnen eines Editors zum Schreiben eines Skripts". 2. Es spielt keine Rolle, wie schnell Ihre Regex zu falschen Ergebnissen führen kann| grep -Po '"text":.*?[^\\]",'|awk -F':' '{print $2}'
-P
Option fehlt. Ich habe unter OSX 10.11.5 getestet undgrep --version
wargrep (BSD grep) 2.5.1-FreeBSD
. Ich habe es mit der Option "Extended Regex" unter OSX zum Laufen gebracht. Der Befehl von oben wäregrep -Eo '"text":.*?[^\\]",' tweets.json
.Aufgrund der Tatsache, dass einige der Empfehlungen hier (insbesondere in den Kommentaren) die Verwendung von Python vorschlugen, war ich enttäuscht, kein Beispiel zu finden.
Hier ist also ein Einzeiler, um einen einzelnen Wert aus einigen JSON-Daten zu erhalten. Es wird davon ausgegangen, dass Sie die Daten (von irgendwoher) weiterleiten und daher in einem Skriptkontext nützlich sein sollten.
quelle
pythonpy
( github.com/russell91/pythonpy ist fast immer eine bessere Alternative zupython -c
, obwohl es mit pip installiert werden muss. Pipe einfach den json anpy --ji -x 'x[0]["hostname"]'
. Wenn Sie die eingebaute json_input-Unterstützung nicht verwenden möchten, können Sie sie trotzdem erhalten Diese importieren automatisch alspy 'json.loads(sys.stdin)[0]["hostname"]'
jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); print($1)"; }
damit ich schreiben kann:curl ...... | jsonq 'json.dumps([key["token"] for key in obj], indent=2)'
& mehr ähnliche beängstigende Dinge ... Übrigens,obj[0]
scheint unnötig, es sieht so aus, als ob esobj
in Standardfällen nur in Ordnung ist (?).jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); sys.stdout.write(json.dumps($1))"; }
obj[0]
verursacht beim Parsen einen Fehler{ "port":5555 }
. Funktioniert gut nach dem Entfernen[0]
.Nach MartinR und Boeckos Führung:
Dadurch erhalten Sie eine äußerst grep-freundliche Ausgabe. Sehr angenehm:
quelle
| grep field
. Vielen Dank!jq
wird normalerweise nicht installiert, während Python ist. Sobald Sie in Python sind, können Sie auch den ganzen Weg gehen und ihn analysieren mitimport json...
Sie können einfach Binärdateien für Ihre Plattform herunterladen
jq
und (chmod +x jq
) ausführen :Es extrahiert
"name"
Attribute aus dem JSON-Objekt.jq
Die Homepage sagt, es sei wiesed
bei JSON-Daten.quelle
jq
ist ein erstaunliches Werkzeug.curl -s https://api.example.com/jobs | jq '.jobs[] | {id, o: .owner.username, dateCreated, s: .status.state}'
Verwenden von Node.js.
Wenn das System hat KnotenBei der Installation können Sie die Skriptflags
-p
print und-e
evaulate verwendenJSON.parse
, um den erforderlichen Wert abzurufen .Ein einfaches Beispiel mit der JSON-Zeichenfolge
{ "foo": "bar" }
und dem Herausziehen des Werts "foo":Da wir Zugriff auf
cat
und andere Dienstprogramme haben, können wir dies für Dateien verwenden:Oder ein anderes Format wie eine URL, die JSON enthält:
quelle
node -p -e 'JSON.parse(process.argv[1]).foo' '{ "foo": "bar" }'
curl -s https://api.github.com/users/trevorsenior | node -pe "JSON.parse(require('fs').readFileSync('/dev/stdin').toString()).name"
cat package.json | node -pe 'JSON.parse(fs.readFileSync(0)).version'
Verwenden Sie die JSON-Unterstützung von Python anstelle von awk!
Etwas wie das:
quelle
json.load(sys.stdin)['"key']"
als Beispiel wie :curl -sL httpbin.org/ip | python -c "import json,sys; print json.load(sys.stdin)['origin']"
.Sie haben gefragt, wie Sie sich in den Fuß schießen sollen, und ich bin hier, um die Munition bereitzustellen:
Sie könnten
tr -d '{}'
anstelle von verwendensed
. Aber sie komplett wegzulassen scheint auch den gewünschten Effekt zu haben.Wenn Sie die äußeren Anführungszeichen entfernen möchten, leiten Sie das Ergebnis der obigen Angaben durch
sed 's/\(^"\|"$\)//g'
Ich denke, andere haben ausreichend Alarm geschlagen. Ich werde mit einem Handy bereitstehen, um einen Krankenwagen zu rufen. Feuer, wenn es fertig ist.
quelle
Verwenden von Bash mit Python
Erstellen Sie eine Bash-Funktion in Ihrer .bash_rc-Datei
Dann
Hier ist die gleiche Funktion, jedoch mit Fehlerprüfung.
Wobei $ # -ne 1 mindestens 1 Eingabe sicherstellt und -t 0 sicherstellt, dass Sie von einer Pipe umleiten.
Das Schöne an dieser Implementierung ist, dass Sie auf verschachtelte JSON-Werte zugreifen und dafür JSON erhalten können! =)
Beispiel:
Wenn Sie wirklich ausgefallen sein möchten, können Sie die Daten hübsch ausdrucken:
quelle
curl http://foo | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["environment"][0]["name"]'
sys.stdout.write()
Wenn Sie möchten, dass es sowohl mit Python 2 als auch mit Python 3 funktioniert.getJsonVal() { py -x "json.dumps(json.loads(x)$1, sort_keys=True, indent=4)"; }
TickTick ist ein in Bash geschriebener JSON-Parser (<250 Codezeilen)
Hier ist der Ausschnitt des Autors aus seinem Artikel " Stellen Sie sich eine Welt vor, in der Bash JSON unterstützt :
quelle
Analysieren von JSON mit PHP CLI
Wohl nicht zum Thema, aber da Vorrang herrscht, bleibt diese Frage unvollständig, ohne dass unser vertrauenswürdiges und treues PHP erwähnt wird. Stimmt das?
Verwenden Sie dasselbe Beispiel für JSON, aber lassen Sie es einer Variablen zuweisen, um die Dunkelheit zu verringern.
Nun zur PHP-Güte, mit file_get_contents und dem Stream-Wrapper php: // stdin .
oder wie unter Verwendung von fgets und dem bereits geöffneten Stream bei der CLI-Konstante STDIN hervorgehoben .
nJoy!
quelle
$argn
anstelle vonfgets(STDIN)
$argn
funktioniert mit dem Flag -E oder -R und nur, wenn sich der JSON-Inhalt in einer Zeile befindet ...Native Bash-Version: Funktioniert auch gut mit Backslashes (\) und Anführungszeichen (")
quelle
Version, die Ruby und http://flori.github.com/json/ verwendet
oder genauer:
quelle
;
in Ruby nicht erforderlich ist (es wird nur zum Verketten von Anweisungen verwendet, die normalerweise in separaten Zeilen zu einer einzelnen Zeile stehen).Leider ist die oben gestimmt Antwort , dass Anwendungen
grep
gibt die volle Übereinstimmung, die nicht Arbeit in meinem Szenario tat, aber wenn Sie wissen , das JSON - Format konstant bleiben können Sie verwenden Lookbehind und Look - Ahead nur die gewünschten Werte zu extrahieren.quelle
Wenn jemand nur Werte aus einfachen JSON-Objekten extrahieren möchte, ohne dass verschachtelte Strukturen erforderlich sind, können reguläre Ausdrücke verwendet werden, ohne die Bash zu verlassen.
Hier ist eine Funktion, die ich mithilfe von regulären Bash-Ausdrücken basierend auf dem JSON-Standard definiert habe :
Vorsichtsmaßnahmen: Objekte und Arrays werden nicht als Wert unterstützt, aber alle anderen im Standard definierten Werttypen werden unterstützt. Außerdem wird ein Paar abgeglichen, unabhängig davon, wie tief es im JSON-Dokument ist, solange es genau denselben Schlüsselnamen hat.
Am Beispiel von OP:
quelle
Es gibt eine einfachere Möglichkeit, eine Eigenschaft aus einer JSON-Zeichenfolge abzurufen.
package.json
Versuchen Sie dies am Beispiel einer Datei:Wir verwenden,
process.env
weil dadurch der Inhalt der Datei als Zeichenfolge in node.js übertragen wird, ohne dass das Risiko besteht, dass böswillige Inhalte aus dem Zitat entweichen und als Code analysiert werden.quelle
require()
tatsächlich Fremdcode ausgeführt werden kann, JSON.parse nicht.JSON.parse()
und ja, Sie sind eindeutig sicher ... aber hier empfängt die JSON-Laufzeit den (nicht vertrauenswürdigen) Inhalt im Band mit dem (vertrauenswürdigen) Code.JSON.parse()
sind Sie ebenfalls sicher, aber das passiert auch hier nicht.JSON.parse()
, in den Code einsetzen . Sie gehen davon aus, dass das Setzen von Literal-Backticks den Inhalt wörtlich hält, aber das ist eine völlig unsichere Annahme, da Literal-Backticks im Dateiinhalt (und damit in der Variablen) vorhanden sein können und somit das Anführungszeichen beenden und in einen nicht zitierten Kontext eintreten können, in dem die Werte werden als Code ausgeführt.Jetzt, da Powershell plattformübergreifend ist, dachte ich, ich würde mich da rauswerfen, da ich finde, dass es ziemlich intuitiv und extrem einfach ist.
ConvertFrom-Json konvertiert den JSON in ein benutzerdefiniertes Powershell-Objekt, sodass Sie von diesem Punkt an problemlos mit den Eigenschaften arbeiten können. Wenn Sie zum Beispiel nur die Eigenschaft 'id' möchten, tun Sie dies einfach:
Wenn Sie das Ganze aus Bash heraus aufrufen möchten, müssen Sie es so nennen:
Natürlich gibt es eine reine Powershell-Methode, um es ohne Locken zu machen.
Schließlich gibt es noch 'ConvertTo-Json', das ein benutzerdefiniertes Objekt genauso einfach in JSON konvertiert. Hier ist ein Beispiel:
Welches würde schönes JSON wie dieses produzieren:
}}
Zugegeben, die Verwendung einer Windows-Shell unter Unix ist etwas sakrilegisch, aber Powershell ist in einigen Dingen wirklich gut, und das Parsen von JSON und XML sind einige davon. Dies ist die GitHub-Seite für die plattformübergreifende Version https://github.com/PowerShell/PowerShell
quelle
Jemand, der auch XML-Dateien hat, möchte sich vielleicht meinen Xidel ansehen . Es ist ein cli, abhängigkeitsfreies JSONiq Prozessor. (dh es unterstützt auch XQuery für die XML- oder JSON-Verarbeitung)
Das Beispiel in der Frage wäre:
Oder mit meiner eigenen, nicht standardmäßigen Erweiterungssyntax:
quelle
xidel -s https://api.github.com/users/lambda -e 'name'
(oder-e '$json/name'
, oder-e '($json).name'
).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!
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.
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.
quelle
Sie können so etwas versuchen -
quelle
Sie können verwenden
jshon
:quelle
Hier ist eine Möglichkeit, wie Sie es mit awk tun können
quelle
Für eine komplexere JSON-Analyse empfehle ich die Verwendung des Python-Jsonpath-Moduls (von Stefan Goessner) -
sudo easy_install -U jsonpath
Beispiel file.json (von http://goessner.net/articles/JsonPath ) -
Analysieren Sie es (extrahieren Sie alle Buchtitel mit einem Preis <10) -
Wird ausgegeben -
HINWEIS: Die obige Befehlszeile enthält keine Fehlerprüfung. Für eine vollständige Lösung mit Fehlerprüfung sollten Sie ein kleines Python-Skript erstellen und den Code mit try-exception umschließen.
quelle
jsonpath
so installiertjsonpath_rw
stattdessen ist hier so etwas ähnliches Sie , wenn der oben versuchen nicht funktioniert: 1)/usr/bin/python -m pip install jsonpath-rw
2)cat ~/trash/file.json | /usr/bin/python -c "from jsonpath_rw import jsonpath, parse; import sys,json; jsonpath_expr = parse('store.book[0]'); out = [match.value for match in jsonpath_expr.find(json.load(sys.stdin))]; print out;"
(ich den vollständigen Pfad zum Python binären verwendet , weil ich einige Probleme mit mehreren Pythons aufweist , wurde Eingerichtet).Wenn Sie PHP haben :
Zum Beispiel:
Wir haben eine Ressource, die json mit Länder-ISO-Codes versorgt: http://country.io/iso3.json, und wir können sie leicht in einer Shell mit Curl sehen:
aber es sieht nicht sehr praktisch und nicht lesbar aus, besser json analysieren und lesbare Struktur sehen:
Dieser Code gibt Folgendes aus:
Wenn Sie verschachtelte Arrays haben, sieht diese Ausgabe viel besser aus ...
Hoffe das wird hilfreich ...
quelle
Es gibt auch ein sehr einfaches, aber leistungsstarkes JSON CLI- Verarbeitungstool fx - https://github.com/antonmedv/fx
Beispiele
Verwenden Sie eine anonyme Funktion:
Wenn Sie die anonyme Funktion param => ... nicht übergeben, wird der Code automatisch in eine anonyme Funktion umgewandelt. Mit diesem Schlüsselwort können Sie auf JSON zugreifen:
Oder verwenden Sie einfach auch die Punktsyntax:
Sie können eine beliebige Anzahl anonymer Funktionen zum Reduzieren von JSON übergeben:
Sie können vorhandenes JSON mit dem Spread-Operator aktualisieren:
Einfach nur JavaScript . Sie müssen keine neue Syntax lernen.
UPDATE 2018-11-06
fx
hat jetzt interaktiven Modus ( ! )https://github.com/antonmedv/fx
quelle
Dies ist eine weitere
bash
&python
hybride Antwort. Ich habe diese Antwort gepostet, weil ich komplexere JSON-Ausgaben verarbeiten wollte, aber die Komplexität meiner Bash-Anwendung reduzieren wollte. Ich möchte das folgende JSON-Objekt von http://www.arcgis.com/sharing/rest/info?f=json in öffnenbash
:Im folgenden Beispiel habe ich meine eigene Implementierung
jq
undunquote
Nutzung erstelltpython
. Sie werden feststellen, dass wir nach dem Importieren des Python-Objektsjson
in ein Python-Wörterbuch die Python-Syntax verwenden können, um im Wörterbuch zu navigieren. Um darin zu navigieren, lautet die Syntax:data
data[ "authInfo" ]
data[ "authInfo" ][ "tokenServicesUrl" ]
Durch die Verwendung von Magie in Bash lassen wir
data
den Python-Text rechts von den Daten weg und geben ihn nur an, d. H.jq
jq '[ "authInfo" ]'
jq '[ "authInfo" ][ "tokenServicesUrl" ]'
Beachten Sie, ohne Parameter,
jq
als JSON-Prettifier fungiert. Mit Parametern können wir die Python-Syntax verwenden, um alles, was wir wollen, aus dem Wörterbuch zu extrahieren, einschließlich der Navigation in Unterwörterbüchern und Array-Elementen.Hier ist ein Arbeitsbeispiel, das Folgendes demonstriert:
quelle
Ich habe dies getan und eine JSON-Antwort für einen bestimmten Wert wie folgt "analysiert":
Natürlich wäre $ url hier die Twitter-URL und $ var wäre "Text", um die Antwort für diese Variable zu erhalten.
Wirklich, ich denke, das einzige, was ich beim OP ausgelassen habe, ist grep für die Zeile mit der spezifischen Variablen, die er sucht. Awk schnappt sich den zweiten Punkt in der Zeile und mit sed entferne ich die Anführungszeichen.
Jemand, der schlauer ist als ich, könnte wahrscheinlich das ganze Denken mit awk oder grep machen.
Jetzt können Sie alles mit nur sed machen:
also kein awk, kein grep ... Ich weiß nicht, warum ich vorher nicht daran gedacht habe. Hmmm...
quelle
grep | awk | sed
undsed | sed | sed
Pipelines sind verschwenderische Antimuster. Ihr letztes Beispiel kann leicht umgeschrieben werden,curl "$url" | sed '/text/!d;s/\"text\"://g;s/\"//g;s/\ //g'
aber wie andere bereits betont haben, ist dies ein fehleranfälliger und spröder Ansatz, der überhaupt nicht empfohlen werden sollte.Das Parsen von JSON ist in einem Shell-Skript schmerzhaft. Erstellen Sie mit einer geeigneteren Sprache ein Tool, das JSON-Attribute auf eine Weise extrahiert, die mit den Shell-Skriptkonventionen übereinstimmt. Sie können Ihr neues Tool verwenden, um das Problem mit der sofortigen Shell-Skripterstellung zu lösen und es dann für zukünftige Situationen zu Ihrem Kit hinzuzufügen.
Betrachten wir zum Beispiel ein Werkzeug jsonlookup so dass , wenn ich sage ,
jsonlookup access token id
es wird das Attribut zurückgeben id im Attribut definiert Token innerhalb des Attribut definiert Zugriff von stdin, die vermutlich ist JSON - Daten. Wenn das Attribut nicht vorhanden ist, gibt das Tool nichts zurück (Exit-Status 1). Wenn die Analyse fehlschlägt, beenden Sie Status 2 und eine Nachricht an stderr. Wenn die Suche erfolgreich ist, druckt das Tool den Wert des Attributs.Nachdem Sie ein Unix-Tool zum genauen Extrahieren von JSON-Werten erstellt haben, können Sie es problemlos in Shell-Skripten verwenden:
Jede Sprache reicht für die Implementierung von jsonlookup . Hier ist eine ziemlich prägnante Python-Version:
quelle
Ein Zweiliner, der Python verwendet. Dies funktioniert besonders gut, wenn Sie eine einzelne .sh-Datei schreiben und nicht von einer anderen .py-Datei abhängig sein möchten. Es nutzt auch die Verwendung von Rohren
|
.echo "{\"field\": \"value\"}"
kann durch alles ersetzt werden, was einen json auf das stdout druckt.quelle
Dies ist ein guter Anwendungsfall für Pythonpy :
quelle