[英]jq JSON display all values on same line
我確信這很簡單,但我已經嘗試了幾個小時。
我想在 appservice 數組下的每個 object 中顯示這兩個值,並在一行上列出每個塊的兩個值以及相關的 IP 和名稱。
我的 JSON 是這樣的:
{
"allow": [
{
"name": "username1",
"scm": "true",
"ipstart": "192.168.1.2",
"ipend": "192.168.1.2",
"cidr": "/32",
"resources": [
{
"appservice": [
{
"resourcegroup": "resourcegroup1",
"resource": "resource1"
},
{
"resourcegroup": "resourcegroup2",
"resource": "resource2"
}
]
},
{
"sqlserver": [
{
"resourcegroup": "resourcegroup3",
"resource": "resource3"
},
{
"resourcegroup": "resourcegroup4",
"resource": "resource4"
}
]
}
]
},
{
"name": "username2",
...
...
我想這樣結束:
192.168.1.2 resourcegroup1 resource1 username1
192.168.1.2 resourcegroup2 resource2 username1
192.168.1.3 resourcegroup5 resource5 username2
192.168.1.3 resourcegroup6 resource6 username2
我努力了:
jq -r '.allow[] | "\(.ipstart) \(.resources[].appservice[]?.resourcegroup) \(.resources[].appservice[]?.resource) \(.name)"' test.json
這必須迭代太多次,因為我得到雙倍的行並且“資源組”名稱與“資源”名稱不匹配
192.168.1.2 resourcegroup1 resource1 username1
192.168.1.2 resourcegroup2 resource1 username1
192.168.1.2 resourcegroup1 resource2 username1
192.168.1.2 resourcegroup2 resource2 username1
192.168.1.3 resourcegroup5 resource5 username2
192.168.1.3 resourcegroup6 resource5 username2
192.168.1.3 resourcegroup5 resource6 username2
192.168.1.3 resourcegroup6 resource6 username2
我試過了:
jq -r '.allow[] | "\(.ipstart) \(.resources[].appservice[]? | .[]) \(.name)"' test.json
這給了我:
192.168.1.2 resourcegroup1 username1
192.168.1.2 resource1 username1
192.168.1.2 resourcegroup2 username1
192.168.1.2 resource2 username1
192.168.1.3 resourcegroup5 username2
192.168.1.3 resource5 username2
192.168.1.3 resourcegroup6 username2
192.168.1.3 resource6 username2
我也嘗試了其他組合,但以上是最接近的。 我可以做一些 sed/awk 工作來重新解析 jq output,但我確信必須有一些非常簡單的方法通過 jq 來避免重新解析它。
這個簡單的變化不應該有您嘗試的笛卡爾積問題。 您的錯誤似乎是過早地引入了字符串插值。
jq -r '.allow[]
| {ipstart,name} + .resources[].appservice[]?
| "\(.ipstart) \(.resourcegroup) \(.resource) \(.name)"
' file.json
可能有更短的方法,但這似乎有效:
jq -r '.allow[]
| .ipstart as $ip | .name as $name
| .resources[].appservice | select(.)
| .[].name |= $name | .[].ip |= $ip
| .[] | [.ip, .resourcegroup, .resource, .name]
| @tsv
' file.json
如果你想要空格分隔的值(不管這些值是否包含空格),你可以使用join/1
:
jq -r '.allow[]
| [.ipstart]
+ (.resources[].appservice[]?
| [.resourcegroup, .resource])
+ [.name]
| join(" ")
' file.json
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.