簡體   English   中英

jq JSON 在同一行顯示所有值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM