我希望仅从UserStatus = FORCE_CHANGE_PASSWORD的记录中获取电子邮件地址。
{
"Users": [
{
"Username": "",
"Attributes": [
{
"Name": "sub",
"Value": ""
},
{
"Name": "email_verified",
"Value": "true"
},
{
"Name": "email",
"Value": "john@example.com"
}
],
"UserCreateDate": "",
"UserLastModifiedDate": "",
"Enabled": true,
"UserStatus": "CONFIRMED"
},
{
"Username": "",
"Attributes": [
{
"Name": "sub",
"Value": ""
},
{
"Name": "email_verified",
"Value": "true"
},
{
"Name": "email",
"Value": "jane@example.com"
}
],
"UserCreateDate": "",
"UserLastModifiedDate": "",
"Enabled": true,
"UserStatus": "FORCE_CHANGE_PASSWORD"
}
]
}
下面的表达式可以工作,但是现在我需要弄清楚如何在删除前两个Value键的同时获取包含电子邮件地址的3rd Value键。
jq ".Users[] | select(.UserStatus | contains(\"FORCE_CHANGE_PASSWORD\")) | {UserStatus: .UserStatus, Values: [.Attributes[].Value]}" userlist.json
答案 0 :(得分:0)
发布的JSON不太有效,因此以下假定多余的逗号已被删除。
使用更正的JSON,发布的程序将产生预期的结果:
{
"UserStatus": "FORCE_CHANGE_PASSWORD",
"Values": [
"",
"true",
"jane@example.com"
]
}
.Users[]
| select(.UserStatus | contains("FORCE_CHANGE_PASSWORD"))
| {UserStatus, email: (.Attributes | from_entries.email) }
产生:
{
"UserStatus": "FORCE_CHANGE_PASSWORD",
"email": "jane@example.com"
}
或者仅考虑.email的值:
.Users[]
| select(.UserStatus | contains("FORCE_CHANGE_PASSWORD"))
| .Attributes[]
| select(.Name == "email").Value
如果要基于.UserStatus等于“ FORCE_CHANGE_PASSWORD”进行过滤,则当然可以使用==
。
请注意,在文字对象规范中,UserStatus: .UserStatus
可以缩写为UserStatus
。