So extrahieren Sie Daten nach einem Feld in einer Datei

So extrahieren Sie Daten nach einem Feld in einer Datei

Ich habe folgenden Text in einer Datei

 "rules": [
        "/Common/Tetration_TCP_L4_ipfix",
        "/Common/_sys_https_redirect"
    ],
    "rulesReference": [
        {
            "link": "https://localhost/mgmt/tm/ltm/rule/~Common~Tetration_TCP_L4_ipfix?ver=12.0.0"
        }

wollen etwas extrahieren im "rules": [] Moment ist es

/Common/Tetration_TCP_L4_ipfix
/Common/_sys_https_redirect

Die Ausgabe sollte ungefähr so ​​aussehen:

Tetration_TCP_L4_ipfix
_sys_https_redirect

aber das kann wiederum alles sein.

Antwort1

Wenn Ihre Eingabedatei kein vollwertiges JSON, sondern nur innere Fragmente (obwohl strukturell gültig) enthält, können Sie die fehlenden „äußeren“ Teile wiederherstellen, um eine vollständig gültige JSON-Struktur zu erhalten.

sed+jqLösung:

jq -r '.rules[] | sub("/Common/"; "")' <(sed '1 s/^/{/; $ s/$/]}/' file)

Die Ausgabe:

Tetration_TCP_L4_ipfix
_sys_https_redirect

Wenn Sie tatsächlich über ein gültiges JSON verfügen, überspringen Sie einfach die sedVerarbeitung und verwenden Sie Folgendes:

jq -r '.rules[] | sub("/Common/"; "")' file

Antwort2

Wenn dies eine wohlgeformte JSON-Datei ist:

$ jq -r '..|select(type=="object" and has("rules")).rules|map(split("/")|.[-1])|.[]' file.json
Tetration_TCP_L4_ipfix
_sys_https_redirect

Damit werden jqrekursiv alle JSON-Objekte mit einem rulesSchlüssel gefunden. Für alle Array-Werte dieser Schlüssel wird der Wert aufgeteilt /und die letzte Komponente davon zurückgegeben.

Antwort3

Verwenden vonAWK:

awk -F '[/"]' '/"rules": /,/],/{if(/"rules": |],/) next; print $(NF-1)}' file.txt

verwandte Informationen