jq를 사용하여 JSON 문자열을 테이블로 형식화하는 방법은 무엇입니까?

jq를 사용하여 JSON 문자열을 테이블로 형식화하는 방법은 무엇입니까?

아래와 같이 터미널에 출력을 표시하려면 jq를 사용하여 JSON 문자열을 표 형식으로 변환해야 합니다.

{
  "results": [
    [
      {
        "field": "@timestamp",
        "value": "2023-07-03 08:28:00.000"
      },
      {
        "field": "CpuReserved",
        "value": "8192.0"
      },
      {
        "field": "CpuUtilized",
        "value": "4056.412942708333"
      },
      {
        "field": "MemoryReserved",
        "value": "61440"
      },
      {
        "field": "MemoryUtilized",
        "value": "4311"
      },
      {
        "field": "@ptr",
        "value": "CpABClUKUTE0NjcxNzAzNzI0NzovYXdzL2Vjcy9jb250YWluZXJpbnNpZ2h0cy9pcmwtaW5mcmEtc2hhcmVkLWplbmtpbnMtbWFpbi9wZXJmb3JtYW5jZRABEjUaGAIGSaxosQAAAAAd+TFeAAZKKHIwAAABEiABKIDF9taRMTDA7v3WkTE4BkC9NEjNPFCBIRgAEAAYAQ=="
      }
    ],
    [
      {
        "field": "@timestamp",
        "value": "2023-07-03 08:28:00.000"
      },
      {
        "field": "CpuReserved",
        "value": "8192.0"
      },
      {
        "field": "CpuUtilized",
        "value": "4056.412942708333"
      },
      {
        "field": "MemoryReserved",
        "value": "61440"
      },
      {
        "field": "MemoryUtilized",
        "value": "4311"
      },
      {
        "field": "@ptr",
        "value": "CpABClUKUTE0NjcxNzAzNzI0NzovYXdzL2Vjcy9jb250YWluZXJpbnNpZ2h0cy9pcmwtaW5mcmEtc2hhcmVkLWplbmtpbnMtbWFpbi9wZXJmb3JtYW5jZRABEjUaGAIGSaxosQAAAAAd+TFeAAZKKHIwAAABEiABKIDF9taRMTDA7v3WkTE4BkC9NEjNPFCBIRgAEAEYAQ=="
      }
    ]
  ]
}

터미널에 표시하고 싶은 내용은 다음과 같습니다.

@timestamp                CpuReserved  CpuUtilized         MemoryReserved   MemoryUtilized  
==========================================================================================
2023-07-03 08:16:00.000   8192.0       410.5300065104166   61440            1417
2023-07-03 08:15:00.000   8192.0       702.310791015625    61440            792

누군가 나를 올바른 방향으로 안내할 수 있나요?

ベストアンサー1

아마도:

$ jq -c '.results[]|map(.key=.field)|from_entries|del(."@ptr")' file.json |
   mlr --ijson --opprint --barred cat
+-------------------------+-------------+-------------------+----------------+----------------+
| @timestamp              | CpuReserved | CpuUtilized       | MemoryReserved | MemoryUtilized |
+-------------------------+-------------+-------------------+----------------+----------------+
| 2023-07-03 08:28:00.000 | 8192.0      | 4056.412942708333 | 61440          | 4311           |
| 2023-07-03 08:28:00.000 | 8192.0      | 4056.412942708333 | 61440          | 4311           |
+-------------------------+-------------+-------------------+----------------+----------------+

그렇지 않은 경우 --barred다음과 같습니다.

@̲t̲i̲m̲e̲s̲t̲a̲m̲p̲              C̲p̲u̲R̲e̲s̲e̲r̲v̲e̲d̲ C̲p̲u̲U̲t̲i̲l̲i̲z̲e̲d̲       M̲e̲m̲o̲r̲y̲R̲e̲s̲e̲r̲v̲e̲d̲ M̲e̲m̲o̲r̲y̲U̲t̲i̲l̲i̲z̲e̲d̲
2023-07-03 08:28:00.000 8192.0 4056.412942708333 61440 4311
2023-07-03 08:28:00.000 8192.0 4056.412942708333 61440 4311

jq또한 이 명령의 출력을 vd -f json(시각적 데이터) 바꾸다 mlr(밀러) 대화형 테이블 뷰어를 얻으려면

jq정보를 추출하고 mlr테이블 형식을 지정하는 데만 사용됩니다 . 의 기능 세트 와 의 기능 세트 jq사이에는 약간의 중복이 있습니다 mlr. 예를 들어 s를 @ptr사용하여 열을 삭제할 수도 있습니다 .mlrcut

jq -c '.results[]|map(.key=.field)|from_entries' file.json |
  mlr --ijson --opprint cut -xf @ptr

명령 이 jq세분화되어 주석 처리되었습니다.

jq -c '
  .results[] | # iterate over the elements of the .results array 
               # (which are also arrays)

  map(.key=.field) | # for each of those arrays, transform the
                     # elements (which are objects) by adding a 
                     # field of key "key" with same value as that
                     # with "field" key in each, as that's what
                     # from_entries needs

  from_entries | # transforms those [{"key":"foo","value":"bar"}]
                 # (the "field" field is ignored) to {"foo":"bar"}

  del(."@ptr") # deletes the field with key "@ptr" from those
               # objects' file.json

결과는 JSON이 아니지만 여러 JSON이 함께 연결되어 있지만 둘 다 jq지원됩니다 mlr. (컴팩트) 의 경우 -c이는 줄당 하나의 JSON이 있는 NDJSON(줄바꿈으로 구분된 JSON)이며 vd올바른 JSON을 얻으려면 다음이 필요합니다.

jq -c '.results|map(map(.key=.field)|from_entries|del(."@ptr"))' file.json

우리 map는 이것을 배열에서 사용하므로 .results요소를 반복하는 대신 다른 JSON 배열을 생성합니다. 따라서 최종 결과는 큰 배열입니다. 이는 또한 지원되며 jq(분명히 올바른 JSON임) 에 대한 입력 시간이 약간 길기 때문에 도구가 작업을 수행하기 전에 끝까지 읽어야 함을 의미 mlr합니다 . 그러나 실제로 이것이 성능에 어떤 영향을 미치는지 확인하지 않았습니다.vd]

おすすめ記事