【问题标题】:json remapping with jq用 jq 重新映射 json
【发布时间】:2015-12-06 14:58:30
【问题描述】:

我有以下 json:

[
  {
    "ip": [
      "8.8.4.4/32",
      "212.40.11.20/32"
    ],
    "port": 25,
    "proto": "tcp"
  },
  {
    "ip": [
      "212.40.11.30/32"
    ],
    "port": 3389,
    "proto": "tcp"
  }
]

使用jq我想将ip数组中的ip地址分开,像这样:

[
  {
    "ip": "8.8.4.4/32",
    "port": 25,
    "proto": "tcp"
  },
  {
    "ip": "212.40.11.20/32",
    "port": 25,
    "proto": "tcp"
  },
  {
    "ip": "212.40.11.30/32",
    "port": 3389,
    "proto": "tcp"
  }
]

我在Ubuntu 15.04 上使用jq 1.5bash 4.3.42(1)

编辑:
这就是我从 AWS 生成此列表的方式:
aws ec2 describe-security-groups --group-id sg-2cf5e31 --query 'SecurityGroups[].IpPermissions[].{port:ToPort,proto:IpProtocol,ip:IpRanges[].CidrIp[]}' | jq '.[]'

下一步是添加自定义字段。

感谢您的帮助。

【问题讨论】:

    标签: json bash ubuntu jq


    【解决方案1】:

    比@peak's 和@hek2mgl's 更短、更简单的替代方案,但从根本上仍以相同的概念运行:

    jq 'map(.ip = .ip[])'
    

    【讨论】:

    • 哇!干净简单!
    • 像魅力一样工作,非常优雅,谢谢!
    • 顺便说一句,你能想出一种方法来使用aws 工具来完成它而忽略jq 吗?
    • 目前没有,但可能有人可以!我会为此创建一个单独的问题。 AWS 内部的--query 参数采用JMESPath 命令,与jq 命令非常相似。
    【解决方案2】:
    $ jq 'map(  (.ip[] | { "ip": .}) + del(.ip) )' input.json
    [
      {
        "ip": "8.8.4.4/32",
        "port": 25,
        "proto": "tcp"
      },
      {
        "ip": "212.40.11.20/32",
        "port": 25,
        "proto": "tcp"
      },
      {
        "ip": "212.40.11.30/32",
        "port": 3389,
        "proto": "tcp"
      }
    ]
    

    等效地,可以写map( . + {ip:.ip[]} )

    也就是说(这是使 jq 如此强大的原因之一),如果 STREAMn 是长度为 n 的流,则 value + STREAMn 产生长度为 n 的流,假设 (value + x) 对每个都有效流中的项目。

    确实,STREAMn + STREAMm 产生长度为 m * n 的“笛卡尔积流”,假设项目可以成对添加。

    【讨论】:

      【解决方案3】:

      除了Peak's nice solution,您还可以使用以下表达式:

      jq '[.[]|{ip:.ip[],port,proto}]' aws.json
      

      它很好地展示了jq 如何“扁平化” ip 数组。

      输出:

      [
        {
          "ip": "8.8.4.4/32",
          "port": 25,
          "proto": "tcp"
        },
        {
          "ip": "212.40.11.20/32",
          "port": 25,
          "proto": "tcp"
        },
        {
          "ip": "212.40.11.30/32",
          "port": 3389,
          "proto": "tcp"
        }
      ]
      

      【讨论】:

      • 谢谢你,也很棒!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多