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주변 배열을 삭제해야 합니다.

관련 정보