jqを使用して、 "Media"属性(.session.attributeListの下)に "node7000"文字列を含むブロックの "name"値を取得したいと思います(例では、jsonの最初の配列ブロックが一致します。2つあります)。一致:
"値": "ノード 7000"
"value": "node7000 および node8000"
予想されるjq出力は次のとおりです。
「17200駅」
[{
"name": "Station 17200",
"attributes": [{
"name": "EnableLog",
"value": "1"
}, {
"name": "LogFont",
"value": "0"
}, {
"name": "IdleTimer",
"value": "30"
}
],
"session": [{
"attributeList": [{
"name": "Launch",
"value": "1"
}, {
"name": "Media",
"value": "node7000"
}
]
}, {
"attributeList": [{
"name": "Group",
"value": "1"
}, {
"name": "RMedia",
"value": "1"
}
]
}, {
"attributeList": [{
"name": "Launch",
"value": ""
}, {
"name": "Media",
"value": "node7000 and node8000"
}
]
}
]
},
{
"name": "Station 17300",
"attributes": [{
"name": "EnableLog",
"value": "1"
}, {
"name": "LogFont",
"value": "0"
}, {
"name": "IdleTimer",
"value": "30"
}
],
"session": [{
"attributeList": [{
"name": "Launch",
"value": "1"
}, {
"name": "Media",
"value": "node6000"
}
]
}, {
"attributeList": [{
"name": "Group",
"value": "1"
}, {
"name": "RMedia",
"value": "1"
}
]
}, {
"attributeList": [{
"name": "Launch",
"value": ""
}, {
"name": "Media",
"value": "node6001"
}
]
}
]
}]
ベストアンサー1
jq
解決策:
jq '.[] | select([.session[].attributeList[]
| .name == "Media" and (.value | contains("node7000"))
] | any ).name' jsonfile
.[]
- 入力配列のすべての要素(オブジェクト)を繰り返します。select(<condition>)
<condition>
- この入力が返されると、関数は入力を変更せずtrue
、そうでなければ出力を生成しません。contains(element)
- フィルタ生成が入力に完全に含まれているtrue
かどうかelement
any
true
- 配列の要素が次の場合、フィルタはブール値配列を入力として使用します。true
出力:
"Station 17200"