json в CSV (в формате), используя JQ с полем времени и отсортированы - PullRequest
0 голосов
/ 01 апреля 2020

Я прочитал похожий вопрос, но не нашел ответа. У меня есть эти данные на входе:

{  "connectionHistory": [
{
  "endTime": 1585571806,
  "bytesSent": 31588,
  "startTime": 1585571453,
  "duration": 353,
  "bytesReceived": 68711,
  "virtualIpAddress": "10.20.1.102",
  "remoteIpAddress": "172.16.15.183"
},
{
  "endTime": 1585591333,
  "bytesSent": 21927,
  "startTime": 1585591095,
  "duration": 238,
  "bytesReceived": 51041,
  "virtualIpAddress": "10.20.1.102",
  "remoteIpAddress": "172.16.13.75"
},
{
  "endTime": 1585592547,
  "bytesSent": 4630423,
  "startTime": 1585591333,
  "duration": 1214,
  "bytesReceived": 678052,
  "virtualIpAddress": "10.20.1.102",
  "remoteIpAddress": "172.16.13.75"
},
{
  "endTime": 1585743727,
  "bytesSent": 2153310,
  "startTime": 1585743512,
  "duration": 215,
  "bytesReceived": 499382,
  "virtualIpAddress": "10.20.1.102",
  "remoteIpAddress": "172.16.12.209"
}

]}

И хотелось бы иметь на выходе что-то вроде:

Start               End                 Duration    IP client       IP remote      Received       Sent
01 Apr 2020, 16:13  01 Apr 2020, 16:15  02m 11s     10.20.1.102     5.170.193.103   475.15 K    2.01 M
01 Apr 2020, 14:18  01 Apr 2020, 14:22  03m 35s     10.20.1.102     5.170.192.209   487.68 K    2.05 M
30 Mar 2020, 20:02  30 Mar 2020, 20:22  20m 14s     10.20.1.102     5.170.193.75    662.16 K    4.42 M
30 Mar 2020, 19:58  30 Mar 2020, 20:02  03m 58s     10.20.1.102     5.170.193.75    49.84 K     21.41 K
30 Mar 2020, 14:30  30 Mar 2020, 14:36  05m 53s     10.20.1.102     5.170.195.183   67.1 K      30.85 K

Пытался играть с JQ, но с нет хороших результатов ...

Подсказки приветствуются; -)

Спасибо, П.

1 Ответ

0 голосов
/ 03 апреля 2020

Я сделал несколько попыток и поиска на net. Найденный код, который помогает ( jq: Object не может быть отформатирован в csv, только массив ).

Создан файл json2csv.jq, содержащий:

  def json2headers:
  def isscalar: type | . != "array" and . != "object";
  def isflat: all(.[]; isscalar);
  paths as $p
  | getpath($p)
  | if type == "array" and isflat then $p
     elif isscalar and (($p[-1]|type) == "string") then $p
     else empty end ;

def json2array($header):
  def value($p):
    try getpath($p) catch null
    | if type == "object" then null else . end;
  [$header[] as $p | value($p)];

def json2csv:
  ( [.[] | json2headers] | unique) as $h
  | ([$h[]|join("_") ],
     (.[]
      | json2array($h)
      | map( if type == "array" then map(tostring)|join("|") else tostring end)))
  | @csv ;

Вызовите его с помощью:

 jq -r -L. 'include "json2csv"; json2csv' connAAA.json

Я получил:

"bytesReceived","bytesSent","duration","endTime","remoteIpAddress","startTime","virtualIpAddress"
"9510","4657","81","1585511362","192.168.101.91","1585511281","10.20.1.6"
"48586","52696","1956","1585514599","192.168.101.91","1585512643","10.20.1.6"
"11829","7399","153","1585514835","192.168.101.91","1585514682","10.20.1.6"
"13871","10318","330","1585518156","192.168.101.91","1585517826","10.20.1.6"

Если я использую @tsv вместо @csv Я получил:

bytesReceived   bytesSent       duration        endTime remoteIpAddress startTime       virtualIpAddress
9510    4657    81      1585511362      192.168.101.91  1585511281      10.20.1.6
48586   52696   1956    1585514599      192.168.101.91  1585512643      10.20.1.6
11829   7399    153     1585514835      192.168.101.91  1585514682      10.20.1.6
13871   10318   330     1585518156      192.168.101.91  1585517826      10.20.1.6

Это близко к моему желаемому результату. Теперь (возможно, раньше) мне нужно преобразовать Unix метку времени в DateTime.

Я полагаю, что использую функцию todateiso8601, но не могу вставить ее правильно.

Предположим, это не сложно опытный парень; -)

Спасибо, П.

...