
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
+jq
Lö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 sed
Verarbeitung 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 jq
rekursiv alle JSON-Objekte mit einem rules
Schlü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