Ich muss den Wert von "Name" aus dieser Zeile abrufen
"snapshots": [{"name":"sLVZt","user":"comment","current":"n","created":"2015-03-11 05:28:02"},{"name":"ubg9x","user":"test2",{"name":"lo3Qp","user":"test3","current":"y","created":"2015-03-11 06:02:46"}]}
Ich erwarte, dass die Ausgabe so aussieht
sLVZt
ubg9x
lo3Qp
Antwort1
Vorausgesetzt, Ihr JSON-Dokument ist gültig, wie zum Beispiel
{"snapshots":[{"name":"sLVZt","user":"comment","current":"n","created":"2015-03-11 05:28:02"},{"name":"ubg9x","user":"test2"},{"name":"lo3Qp","user":"test3","current":"y","created":"2015-03-11 06:02:46"}]}
oder (da nicht-Daten-Leerzeichen für das Format irrelevant sind),
{
"snapshots": [
{
"name": "sLVZt",
"user": "comment",
"current": "n",
"created": "2015-03-11 05:28:02"
},
{
"name": "ubg9x",
"user": "test2"
},
{
"name": "lo3Qp",
"user": "test3",
"current": "y",
"created": "2015-03-11 06:02:46"
}
]
}
dann jq
wie folgt verwenden:
$ jq -r '.snapshots[].name' file.json
sLVZt
ubg9x
lo3Qp
Dadurch werden die Werte des name
Schlüssels in jedem Element des snapshots
Arrays extrahiert.
Sie können das Ergebnis auch ganz einfach auf verschiedene Weise anhand der Werte der anderen Schlüssel filtern:
$ jq -r '.snapshots[] | select(.current == "y").name' file.json
lo3Qp
$ jq -r '.snapshots[] | select(.current != "n").name' file.json
ubg9x
lo3Qp
Antwort2
Wenn Sie Linux verwenden oder anderweitig Zugriff auf GNU haben grep
, können Sie Folgendes tun:
$ grep -oP '"name":"\K[^"]+' file
sLVZt
ubg9x
lo3Qp
Alternativ in Perl:
$ perl -lne 'print join "\n", /"name":"([^"]+)/g' file
sLVZt
ubg9x
lo3Qp
Antwort3
Versuche dies,
sed 's/,/\n/g' file | awk -F '"' '$2~/name/ {print $(NF-1)}'
sLVZt
ubg9x
lo3Qp
Antwort4
Eine rein awk
-basierte Lösung könnte wie folgt aussehen:
awk -F':' -v RS=',' '$1 ~ /"name"$/ {print $2}' file
Dies nimmt die Eingabe und teilt die "Datensätze" auf (was normalerweise bedeuten würde,Linie) am ,
und dann alle Datensätze in Felder am :
, so dass zwei Felder pro Datensatz übrig bleiben. Wenn das erste Feldendetin "name"
(dies erklärt die führenden eckigen/geschweiften Klammern) drucken Sie das zweite Feld, also den Wert hinter dem :
.
Wenn Sie die Anführungszeichen loswerden möchten, können Sie verwenden
awk -F':' -v RS=',' '$1 ~ /"name"$/ {gsub("\"","",$2); print $2}' file
Aktualisieren
Da Ihre geänderte Beispieleingabe ein führendes enthält "snapshots":
, das auch das but auf "unausgewogene" Weise enthält :
, wird dies nicht mehr funktionieren. Da in meiner Antwort "rein awk
-basiert" angegeben war, wird die einzige mögliche Anpassung viel aufwändiger sein und in etwa so aussehen:
awk '{n=patsplit($0,field,"\"[^\"]*\":\"[^\"]*\""); for (i=1;i<=n;i++) {split(field[i],elem,":"); if (elem[1]=="\"name\"") print elem[2];};}' file
Dies ist eindeutig weit weniger elegant als die grep
auf -basierten Ansätze und auch weniger portabel (funktioniert mawk
beispielsweise nicht auf ).