2016-12-12 110 views
3

該文件是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"] 
} 

我想找到鍵,其數組值有項的列表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" 
    ] 
] 

回答

3

json中的頂級對象是一個對象,而不是數組。所以.[]只會產生它的值並丟棄鍵。使用with_entries/1來過濾該對象。這將對象轉換爲一個鍵/值對的數組,然後返回,您可以將過濾器應用於其中。

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

此外,您應該避免在這裏使用contains/1。它以遞歸方式應用,因此它也將匹配包含子字符串svc的字符串。即"Foosvcbar"將匹配。

+0

您的回答適合我。我嘗試了upvoting,但沒有足夠的聲望點。 – mg03

+0

您可能無法註冊,但這是您的問題,如果您的問題得到了充分解答,您可以接受答案。考慮接受這個(和你的其他問題),如果這對你有用。 –

+0

完成。接受你的回答。感謝名單 – mg03

4

隨着你的輸入,下面的過濾器產生如圖所示的輸出:

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

相關問題