jq查找其值为包含特定元素的数组的键

mg0*_*g03 4 arrays json key jq

文件是

{
    "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"]
}
Run Code Online (Sandbox Code Playgroud)

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

我可以得到以下工作

cat list.json | jq '. | map(select (. | contains(["svc"])))'
Run Code Online (Sandbox Code Playgroud)

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

[
  [
    "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"
  ]
]
Run Code Online (Sandbox Code Playgroud)

Jef*_*ado 6

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

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

此外,你应该避免contains/1在这里使用.它以递归方式应用,因此它也匹配包含子字符串的字符串svc.即,"Foosvcbar"将匹配.


pea*_*eak 5

使用您的输入,以下过滤器将产生输出,如下所示:

to_entries[] | select( .value | index("svc") ) | .key
Run Code Online (Sandbox Code Playgroud)

输出:

"ContentKey--4-0-47--zjOkiQ"
"IdGenService--2001-4-22--CJUFaMQ"
"IdGenService--2001-4-22--Uhf9CTQ"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用index/1会比使用既简单又(可能快)得多any/2