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]

답변2

그 후에는 다음이 있습니다.

$ jq -r '.results|map(map({key:.field,value}|select(.key!="@ptr"))|from_entries)|(.[0]|keys_unsorted) as $keys|([$keys]+map([.[$keys[]]]))[]|@csv' input.json | xsv table
@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

노트:

  • from_entries키-값 쌍의 배열을 객체로 변환합니다.
  • 객체 배열을 csv로 변환하려면:세부 사항을 확인하세요.
  • xsv table예쁜 프린팅을 위해서만 제거 가능합니다.

답변3

나는 답을 찾은 것 같아요:

jq -r '([ "@timestamp", "CpuReserved", "CpuUtilized", "MemoryReserved", "MemoryUtilized"] | (., map(length*"-"))), ( .results[] | [.[0,1,2,3,4].value] ) | @tsv' |column -ts $'\t'
@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
2023-07-03 08:27:00.000  8192.0       1056.0744270833331  61440           4436
2023-07-03 08:27:00.000  8192.0       1056.0744270833331  61440           4436
2023-07-03 08:26:00.000  8192.0       2756.6764583333334  61440           5138
2023-07-03 08:26:00.000  8192.0       2756.6764583333334  61440           5138
2023-07-03 08:25:00.000  8192.0       5715.494895833333   61440           6600
2023-07-03 08:25:00.000  8192.0       5715.494895833333   61440           6600
2023-07-03 08:24:00.000  8192.0       7977.704166666666   61440           8451
2023-07-03 08:24:00.000  8192.0       7977.704166666666   61440           8451
2023-07-03 08:23:00.000  8192.0       7288.051666666666   61440           4757
2023-07-03 08:23:00.000  8192.0       7288.051666666666   61440           4757
2023-07-03 08:22:00.000  8192.0       4286.02375          61440           4815
2023-07-03 08:22:00.000  8192.0       4286.02375          61440           4815
2023-07-03 08:21:00.000  8192.0       3357.523776041666   61440           2146
2023-07-03 08:21:00.000  8192.0       3357.523776041666   61440           2146
2023-07-03 08:20:00.000  8192.0       990.2647916666666   61440           1692
2023-07-03 08:20:00.000  8192.0       990.2647916666666   61440           1692
2023-07-03 08:19:00.000  8192.0       4533.409375         61440           1816
2023-07-03 08:19:00.000  8192.0       4533.409375         61440           1816
2023-07-03 08:18:00.000  8192.0       939.4855208333333   61440           1810
2023-07-03 08:18:00.000  8192.0       939.4855208333333   61440           1810
2023-07-03 08:17:00.000  8192.0       4770.659791666667   61440           1924
2023-07-03 08:17:00.000  8192.0       4770.659791666667   61440           1924
2023-07-03 08:16:00.000  8192.0       410.5300065104166   61440           1417
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
2023-07-03 08:15:00.000  8192.0       702.310791015625    61440           792
2023-07-03 08:14:00.000  8192.0       0.0                 61440           0
2023-07-03 08:14:00.000  8192.0       0.0                 61440           0

답변4

jq탭으로 구분된 값을 내보내고 column아름답게 만드는 또 다른 방법

jq -r '
  .results
  | first as $first
  | [$first | map(.field)] + [.[] | map(.value)]
  | map(.[:-1])[]
  | @tsv
' file.json | column -t -s $'\t'
@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

관련 정보