如何使用 jq 将多个 JSON 对象中的特定值解析为 csv

如何使用 jq 将多个 JSON 对象中的特定值解析为 csv

我有以下 json

[
   {
      "ip":"105.105.105.105",
      "timestamp":"1543746097",
      "ports":[
         {
            "port":80,
            "proto":"tcp",
            "status":"open",
            "reason":"syn-ack",
            "ttl":128
         }
      ]
   },
   {
      "ip":"105.105.105.105",
      "timestamp":"1543746097",
      "ports":[
         {
            "port":53,
            "proto":"tcp",
            "status":"open",
            "reason":"syn-ack",
            "ttl":128
         }
      ]
   }
]

我想将端口提取为简单csv输出

80,53

我试过

jq -r '.[]."ports" | map(.port) | @csv' 105.105.105.105_tcp.json

jq -r '.[]."ports" | map(.port) | join(",")' 105.105.105.105_tcp.json

但它们都不起作用。

答案1

这是一个仅 jq 的解决方案:

jq -r '[ .[].ports[].port ]|@csv' network.json
80,53

这里的方法是检索端口号,将它们包装到一个数组中,然后将其转换为 CSV 格式。

答案2

我能够通过以下方式获得所需的输出

jq -r '.[]."ports" | .[].port' 105.105.105.105_tcp.json | tr '\n' ',' | sed 's/,*$//g'

不过我想知道是否可以以更优雅的方式完成。

答案3

bash $ jtc -w'<port>l+0' -jr input.json | sed s/[][]//g 
 80, 53 
bash $ 

jtc将提取并打印所有端口并将它们包装到数组中。sed需要删除包围的数组

相关内容