Итерация по массиву JSON и запись определенных значений - PullRequest
0 голосов
/ 04 июня 2019

Мне нужно перебрать этот массив JSON и записать значение числа соединений, если оно больше 0, а затем, если оно больше 0, записать владельца и время последнего отключения и сохранить их ввывод на консоль после завершения сценария.

Я пытался использовать циклы и циклы while, но не могу понять, как записать определенные значения и получить другие значения для вывода на консоль в конце сценария.,

[
  {
    "id" : "123456",
    "owner" : "johndoe",
    "x11-display" : ":9",
    "x11-authority" : "/run/user/1112/dcv/123456.xauth",
    "num-of-connections" : 1,
    "creation-time" : "2019-05-28T14:42:24.027240Z",
    "last-disconnection-time" : "2019-05-30T21:47:36.682935Z"
  },
  {
    "id" : "12345",
    "owner" : "johnsmith",
    "x11-display" : ":5",
    "x11-authority" : "/run/user/user/dcv/12345.xauth",
    "num-of-connections" : 0,
    "creation-time" : "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time" : "2019-05-31T18:58:42.851223Z"
  }
]

Что мне нужно, так это резюме в конце сценария, которое говорит что-то вроде этого.

пользователь $ owner имеет $ num-of-connections открытых соединений и последний раз отключается в $ last-disconnection-time.

Я хочу это только в том случае, если количество соединений больше 0. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 04 июня 2019

Может быть, это?

jq -r '.[] | select(."num-of-connections" > 0) | "User \(.owner) has \(."num-of-connections") open connections and last disconnected at \(."last-disconnection-time")."' test.json

который на ваших фиксированных данных распечатывает:

User johndoe has 1 open connections and last disconnected at 2019-05-30T21:47:36.682935Z.
0 голосов
/ 04 июня 2019

, если вы заинтересованы в альтернативном решении, есть новый способ достижения того же - с помощью утилиты Unix на основе проходного пути jtc, где логика в основном кодируется впрогулка по дереву JSON:

bash $ <file.json jtc -w'[:][num-of-connections]:<^[^0]>D[-1][owner]<o>v[-1][last-disconnection-time]' -T'"user {o} has {$0} open connections and last disconnected at {}"' -qq
user johndoe has 1 open connections and last disconnected at 2019-05-30T21:47:36.682935Z
bash $ 

PS> Раскрытие информации: я создатель инструмента jtc - shell cli для операций JSON

0 голосов
/ 04 июня 2019

Я не знаю, ищите ли вы это решение, потому что запрошенный вывод мне не понятен, но вы можете использовать этот однострочный

jq '.[] | select(."num-of-connections">0) | {"owner": ."owner", "num-of-connections": ."num-of-connections", "last-disconnection-time": ."last-disconnection-time"}' input.json

или этот

jq -r '.[] | select(."num-of-connections">0) | "\(.owner) \(."num-of-connections") \(."last-disconnection-time")"' input.json 
...