ファイル内のフィールドの後のデータの抽出方法

ファイル内のフィールドの後のデータの抽出方法

ファイルに次のテキストがあります

 "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

関連情報