【问题标题】:jq find keys whose value is an array containing a specific elementjq 查找值为包含特定元素的数组的键
【发布时间】:2017-04-27 22:42:21
【问题描述】:

文件是

{
    "ContentKey--4-0-47--Vovb1BQ": ["infra", "qa", "qa-ContentKey-4-0-47-Vovb1BQ", "internal-qa-Conten-WebServi-19E4PUWHRGD44-460820639.us-east-1.elb.amazonaws.com", "plan--default"],
    "ContentKey--4-0-47--zjOkiQ": ["svc", "dev", "dev-ContentKey-4-0-47-zjOkiQ", "dev-Conte-WebServi-KXJXZBDY113W-2116785917.us-east-1.elb.amazonaws.com", "plan--default"],
    "IdGenService--2001-4-22--CJUFaMQ": ["svc", "dev", "dev-IdGenService-2001-4-22-CJUFaMQ", "dev-IdGen-WebServi-R7RVXSYAV92W-304073075.us-east-1.elb.amazonaws.com"],
    "IdGenService--2001-4-22--Uhf9CTQ": ["svc", "qa", "qa-IdGenService-2001-4-22-Uhf9CTQ", "internal-qa-IdGenS-WebServi-RT5BI5EEVZP3-665537643.us-east-1.elb.amazonaws.com"]
}

我想查找其数组值具有条目svc的键列表

我可以得到以下工作

cat list.json | jq '. | map(select (. | contains(["svc"])))'

但输出是值数组而不是键本身

[
  [
    "svc",
    "dev",
    "dev-ContentKey-4-0-47-zjOkiQ",
    "dev-Conte-WebServi-KXJXZBDY113W-2116785917.us-east-1.elb.amazonaws.com",
    "plan--default"
  ],
  [
    "svc",
    "dev",
    "dev-IdGenService-2001-4-22-CJUFaMQ",
    "dev-IdGen-WebServi-R7RVXSYAV92W-304073075.us-east-1.elb.amazonaws.com"
  ],
  [
    "svc",
    "qa",
    "qa-IdGenService-2001-4-22-Uhf9CTQ",
    "internal-qa-IdGenS-WebServi-RT5BI5EEVZP3-665537643.us-east-1.elb.amazonaws.com"
  ]
]

【问题讨论】:

    标签: arrays json key jq


    【解决方案1】:

    根据您的输入,以下过滤器会产生如下所示的输出:

    to_entries[] | select( .value | index("svc") ) | .key
    

    输出:

    "ContentKey--4-0-47--zjOkiQ"
    "IdGenService--2001-4-22--CJUFaMQ"
    "IdGenService--2001-4-22--Uhf9CTQ"
    

    在这种情况下,使用index/1 比使用any/2 更简单(可能)更快。

    【讨论】:

      【解决方案2】:

      您的 json 中的顶级对象是一个对象,而不是一个数组。所以.[] 只会产生它的值并丢弃键。使用 with_entries/1 过滤该对象。这会将对象转换为键/值对数组,然后您可以将过滤器应用到该数组。

      $ jq --arg key 'svc' 'with_entries(select(any(.value[]; . == $key)))' list.json
      

      此外,您应该避免在此处使用contains/1。它以递归方式应用,因此它还将匹配包含子字符串svc 的字符串。即,"Foosvcbar" 将被匹配。

      【讨论】:

      • 你的答案对我有用。我尝试过投票,但没有足够的声望点。
      • 您可能还不能投票,但这是您的问题,如果您的问题得到充分回答,您可以接受答案。如果这对您有用,请考虑接受此(以及您的其他问题)。
      猜你喜欢
      • 2017-05-01
      • 1970-01-01
      • 2014-12-16
      • 2017-10-10
      • 1970-01-01
      • 2020-04-19
      • 2021-12-14
      相关资源
      最近更新 更多