JQ создать массив JSON с помощью Bash - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я пытаюсь получить информацию о моих учетных записях хостинга файлов. Поскольку я храню много своих резервных копий на разных учетных записях. Я использую megatools для запроса информации об учетной записи, которую я затем анализирую в массив. Затем массив выравнивается, используя \ n для необработанного ввода.

Сценарий работает замечательно, но он не создает допустимый JSON. Я не уверен, что мне не хватает, чтобы сделать его действительным. Заранее спасибо за помощь.

Сценарий

function join_by { local IFS="$1"; shift; echo "$*"; }

while IFS='' read -r line || [[ -n "$line" ]]; do
    IFS=, read -ra array <<< "$line"

    nickname=${array[0]}
    user=${array[1]}
    pass=${array[2]}
    data=($(megadf --username=$user --password=$pass))
    data[${#data[@]}]+="$nickname"

    stats=$(join_by $'\n' ${data[@]})

    echo $stats | jq --slurp --raw-input 'split("\n")[:-1] | map([ split(" ")[] ]) | map({
    nick: .[6],
    total: .[1],
    used: .[3],
    free: .[5]
    })' >> /opt/stats/json/accounts.json

done < .accounts

вывод json

[
  {
    "nick": "alt",
    "total": "53687091200",
    "used": "7885201595",
    "free": "45801889605"
  }
]
[
  {
    "nick": "main",
    "total": "214748364800",
    "used": "87240914483",
    "free": "127507450317"
  }
]

Что должно быть

[
  {
    "nick": "alt",
    "total": "53687091200",
    "used": "7885201595",
    "free": "45801889605"
  },
  {
    "nick": "main",
    "total": "214748364800",
    "used": "87240914483",
    "free": "127507450317"
  }
]

.accounts

nickname,user,pass

1 Ответ

0 голосов
/ 30 августа 2018

@ barmar нашел самое простое решение, которое я пропустил ....

Необходим для передачи цикла в JQ

while IFS='' read -r line || [[ -n "$line" ]]; do
    IFS=, read -ra array <<< "$line"
    nickname=${array[0]}
    user=${array[1]}
    pass=${array[2]}
    data=($(megadf --username=$user --password=$pass))
    data[${#data[@]}]+="$nickname"
    stats=$(join_by $'\n' ${data[@]})
    echo $stats
done < .accounts  | jq --slurp --raw-input 'split("\n")[:-1] | map([ split(" ")[] ]) | map({
    nick: .[6],
    total: .[1],
    used: .[3],
    free: .[5]
    })' >> /opt/stats/json/accounts.json
...