
ファイルに次のテキストがあります
"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"
}
内部の何かを抽出したいのですが"rules": []
、現在は
/Common/Tetration_TCP_L4_ipfix
/Common/_sys_https_redirect
出力は次のようになります
Tetration_TCP_L4_ipfix
_sys_https_redirect
しかし、これも何でも構いません。
答え1
入力ファイルに完全な JSON ではなく内部フラグメントのみ (構造的には有効) が含まれている場合は、不足している「外部」部分を復元して、完全に有効な JSON 構造を取得できます。
sed
+jq
解決:
jq -r '.rules[] | sub("/Common/"; "")' <(sed '1 s/^/{/; $ s/$/]}/' file)
出力:
Tetration_TCP_L4_ipfix
_sys_https_redirect
もちろん、実際に有効な JSON がある場合は、sed
処理をスキップして次のように使用します。
jq -r '.rules[] | sub("/Common/"; "")' file
答え2
これが整形式の JSON ファイルである場合:
$ jq -r '..|select(type=="object" and has("rules")).rules|map(split("/")|.[-1])|.[]' file.json
Tetration_TCP_L4_ipfix
_sys_https_redirect
jq
これは、キーを持つすべての JSON オブジェクトを再帰的に検索するために使用されますrules
。これらのキーのすべての配列値に対して、値を分割し/
、その最後のコンポーネントを返します。
答え3
使用AWK:
awk -F '[/"]' '/"rules": /,/],/{if(/"rules": |],/) next; print $(NF-1)}' file.txt