从 linux 中的 json 文件中删除特定数据

Remove specific data from json file in linux

我有一个 json 文件,其中包含一组具有重复字段的数据。我需要删除包含字段特定数据的条目。

Json 文件:

[
    {
        "targets": [
            "172.17.1.199"
        ],
        "labels": {
            "__meta_netbox_pop": "st-1742",
            "__snmp_module__": "arista_sw"
        }
    },
    {
        "targets": [
            "172.17.1.51"
        ],
        "labels": {
            "__meta_netbox_pop": "st-1754",
            "__snmp_module__": "arista_sw"
        }
    }
]

json 文件继续,但这是整个 json 文件的示例。

鉴于 target's IP 的数据,我需要删除 targets 的条目及其 labels

输入:

172.17.1.51

预期输出:

[
    {
        "targets": [
            "172.17.1.199"
        ],
        "labels": {
            "__meta_netbox_pop": "st-1742",
            "__snmp_module__": "arista_sw"
        }
    }
]

如果我正确理解了问题,这应该可以解决问题:

target参数是要删除的IP地址,而file_path是json文件的路径

编辑:还有,不要忘记import json,否则它不会工作

def remove_obj(target, file_path):
    with open(file_path, "r") as data_file:
        data = json.load(data_file)

    for obj in data:
        if target in obj["targets"]:
            data.remove(obj)

    with open(file_path, "w") as data_file:
        json.dump(data, data_file, indent=4)

使用jq:

$ jq --arg ip 172.17.1.51 'map(select(.targets | contains([$ip]) | not ))' input.json 
[
  {
    "targets": [
      "172.17.1.199"
    ],
    "labels": {
      "__meta_netbox_pop": "st-1742",
      "__snmp_module__": "arista_sw"
    }
  }
]