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周辺配列を削除する必要があります。

関連情報