Ich habe eine JSON-Datei members.json
wie unten.
{
"took": 670,
"timed_out": false,
"_shards": {
"total": 8,
"successful": 8,
"failed": 0
},
"hits": {
"total": 74,
"max_score": 1,
"hits": [
{
"_index": "2000_270_0",
"_type": "Medical",
"_id": "02:17447847049147026174478:174159",
"_score": 1,
"_source": {
"memberId": "0x7b93910446f91928e23e1043dfdf5bcf",
"memberFirstName": "Uri",
"memberMiddleName": "Prayag",
"memberLastName": "Dubofsky"
}
},
{
"_index": "2000_270_0",
"_type": "Medical",
"_id": "02:17447847049147026174478:174159",
"_score": 1,
"_source": {
"memberId": "0x7b93910446f91928e23e1043dfdf5bcG",
"memberFirstName": "Uri",
"memberMiddleName": "Prayag",
"memberLastName": "Dubofsky"
}
}
]
}
}
Ich möchte es mit bash
Skript analysieren, um nur die Liste der Felder zu erhalten memberId
.
Die erwartete Ausgabe ist:
memberIds
-----------
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG
Ich habe versucht, folgenden Bash + Python-Code hinzuzufügen .bashrc
:
function getJsonVal() {
if [ \( $# -ne 1 \) -o \( -t 0 \) ]; then
echo "Usage: getJsonVal 'key' < /tmp/file";
echo " -- or -- ";
echo " cat /tmp/input | getJsonVal 'key'";
return;
fi;
cat | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["'$1'"]';
}
Und dann genannt:
$ cat members.json | getJsonVal "memberId"
Aber es wirft:
Traceback (most recent call last):
File "<string>", line 1, in <module>
KeyError: 'memberId'
python
nichtbash
analysieren. ZB ist dieser Fehler sicherlich ein Python-Fehler, kein Bash-Fehler.python
, bedeutet nicht, sein Ziel ist es zu verwendenpython
Antworten:
Wenn Sie verwenden würden:
Sie können die Struktur des verschachtelten Diktonals überprüfen
obj
und sehen, dass Ihre ursprüngliche Zeile lauten sollte:zu dem Element "memberId". Auf diese Weise können Sie den Python als Oneliner behalten.
Wenn das verschachtelte "hits" -Element mehrere Elemente enthält, können Sie Folgendes tun:
Die Lösung von Chris Down ist besser, um einen einzelnen Wert für (eindeutige) Schlüssel auf jeder Ebene zu finden.
Mit meinem zweiten Beispiel, das mehrere Werte ausgibt, stoßen Sie an die Grenzen dessen, was Sie mit einem Einzeiler versuchen sollten. An diesem Punkt sehe ich keinen Grund, die Hälfte der Verarbeitung in bash durchzuführen, und würde zu einer vollständigen Python-Lösung übergehen .
quelle
Eine andere Möglichkeit, dies in bash zu tun, ist die Verwendung von jshon . Hier ist eine Lösung für Ihr Problem mit
jshon
:Die
-e
Optionen extrahieren Werte aus dem json. Der-a
iteriert über das Array und-u
decodiert die endgültige Zeichenfolge.quelle
Nun, Ihr Schlüssel ist ganz klar nicht an der Wurzel des Objekts. Versuchen Sie so etwas:
Dies hat den Vorteil, dass nicht nur Syntax in Python eingefügt wird, was zu Fehlern führen kann (oder schlimmer noch, die Ausführung von willkürlichem Code).
Sie können es dann so nennen:
quelle
Eine andere Alternative ist jq :
quelle
Versuche dies:
Wenn Sie bereits
pretty printed
json haben, warum machen Siegrep
es dann nicht einfach so?Sie können immer ein hübsches gedrucktes Format mit SimpleJson Python erhalten
grep
.Verwenden Sie Dumps:
Danach führen Sie einfach
grep
das Muster 'memberId' aus.Um genau zu sein:
Verwendung:
quelle
Nach diesem Thread würde ich json.tool in Python verwenden:
python -m json.tool members.json | awk -F'"' '/memberId/{print $4}'
quelle
Bei Verwendung von deepdiff müssen Sie die genauen Schlüssel nicht kennen:
quelle
Hier ist eine Bash-Lösung.
find_members.sh
Füge die folgende Zeile zu file + save hinzu
chmod +x find_members.sh
Führen Sie es jetzt aus:
quelle