Ich muss den Wert nach einem bestimmten Wort erhalten

Ich muss den Wert nach einem bestimmten Wort erhalten

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 jqwie folgt verwenden:

$ jq -r '.snapshots[].name' file.json
sLVZt
ubg9x
lo3Qp

Dadurch werden die Werte des nameSchlüssels in jedem Element des snapshotsArrays 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 grepauf -basierten Ansätze und auch weniger portabel (funktioniert mawkbeispielsweise nicht auf ).

verwandte Informationen