【问题标题】:Trying to filter an array output with jq尝试使用 jq 过滤数组输出
【发布时间】:2020-07-29 23:22:22
【问题描述】:

我有这样的输入:

[{
  "ciAttributes": {
    "entries": "{\"hostname-cdc1.website.com\":[\"127.0.0.1\"],\"hostname-cdc1-extension.website.com\":[\"127.0.0.1\"]}"
  },
  "ciAttributes": {
    "entries": "{\"hostname-dfw1.website.com\":[\"127.0.0.1\"],\"hostname-dfw1-extension.website.com\":[\"127.0.0.1\"]}"
  },
  "ciAttributes": {
    "entries": "{\"hostname-cdc2.website.com\":[\"127.0.0.1\"],\"hostname-cdc2-extension.website.com\":[\"127.0.0.1\"]}"
  },
  "ciAttributes": {
    "entries": "{\"hostname-dfw2.website.com\":[\"127.0.0.1\"],\"hostname-dfw2-extension.website.com\":[\"127.0.0.1\"]}"
  },
}]

...当我使用以下命令(操作现有 json)执行我的 jq 时:

jq '.[].ciAttributes.entries | fromjson | keys | [ { hostname: .[0] }] | add' | jq -s '{ instances: . }'

...我得到这个输出:

{
  "instances": [
    {
      "hostname": "hostname-cdc1.website.com"
    },
    {
      "hostname": "hostname-dfw1.website.com"
    },
    {
      "hostname": "hostname-cdc2.website.com"
    },
    {
      "hostname": "hostname-dfw2.website.com"
    }
  ]
}

我的最终目标是只提取包含“cdc”的“主机名”。我尝试过使用 json 选择表达式,但出现语法错误,所以我确定我做错了什么。

【问题讨论】:

    标签: arrays json select jq


    【解决方案1】:

    首先,不需要多次调用 jq。

    其次,由于主对象没有不同的键名,您必须使用 --stream 命令行选项。

    第三,您可以使用test 来选择感兴趣的主机名,特别是在看起来确实如此的情况下,标准可以最容易地表示为正则表达式。

    所以简而言之,这里有一个解决方案:

    调用

    jq -n --stream -c -f program.jq input.json
    

    program.jq

    {instances:
     [inputs
     | select(length==2 and (.[0][-2:] == ["ciAttributes", "entries"]))
     | .[-1]
     | fromjson
     | keys_unsorted[]
     | select(test("cdc.[.]"))]}
    

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多