JQ-连接嵌套数组和筛选器



我正在尝试使用JQ创建以下路径:

/staging-data-0/cassandra/cassandra-client-port
/staging-data-0/cassandra/cassandra-gossip-port

来自以下JSON的blob(我已经去掉了不必要的部分(:

{
"DebugConfig": {
"ServerPort": 8300,
"Services": [
{
"Checks": [
{
"CheckID": "cassandra-client-port",
"Timeout": "1s"
},
{
"CheckID": "cassandra-gossip-port",
"Timeout": "1s"
}
],
"Name": "cassandra"
},
{
"Checks": [
{
"CheckID": "cockroachdb-tcp",
"Timeout": "1s"
}
],
"Name": "cockroachdb"
}
]
},
"Member": {
"Name": "staging-data-0"
},
"Meta": {
"consul-network-segment": ""
}
}

我正在努力使用JQ手册来生成路径,到目前为止,我只能使用提取最后一部分

jq '.DebugConfig.Services | map(select(.Name=="cassandra")) | map(.Checks[].CheckID)'

最终路径应为/{.Member.Name}/{.DebugConfig.Services.Name}/{.DebugConfig.Services.Checks.CheckID}

cassandra

jq -r '{a:.Member.Name, b:.DebugConfig.Services[]} | select(.b.Name=="cassandra") | {a:.a, b:.b.Name, c:.b.Checks[].CheckID} | [.a, .b, .c] | join("/")'
staging-data-0/cassandra/cassandra-client-port
staging-data-0/cassandra/cassandra-gossip-port

两个

jq -r '{a:.Member.Name, b:.DebugConfig.Services[]} | {a:.a, b:.b.Name, c:.b.Checks[].CheckID} | [.a, .b, .c] | join("/")'
staging-data-0/cassandra/cassandra-client-port
staging-data-0/cassandra/cassandra-gossip-port
staging-data-0/cockroachdb/cockroachdb-tcp

根据您的输入,jq过滤器:

.DebugConfig.Services[] as $s
| "/(.Member.Name)/($s.Name)/($s.Checks[].CheckID)"

生产:

"/staging-data-0/cassandra/cassandra-client-port"
"/staging-data-0/cassandra/cassandra-gossip-port"
"/staging-data-0/cockroachdb/cockroachdb-tcp"

既然你只想要";卡桑德拉;字符串,你只需要插入一个"选择";过滤器:

.DebugConfig.Services[] as $s
| "/(.Member.Name)/($s.Name)/" +
($s
| select(.Name == "cassandra")
| .Checks[].CheckID)

但值得注意的是,处理所有";支票";项目。

最新更新