Итак, во-первых, чтобы люди, у которых нет yum
, могли это проверить, давайте создадим функцию-обертку:
write_output() { cat <<EOF
Repo-id: wazuh_repo
Repo-name: Wazuhrepository
Repo-status: enabled
Repo-revision: 1536348945
Repo-updated: FriSep712:35:512018
Repo-pkgs: 73
Repo-size: 920M
Repo-baseurl: https://packages.wazuh.com/3.x/yum/
Repo-expire: 21,600second(s)(last:WedOct3108:59:002018)
EOF
}
Примечательно, что все ваши ключи идут перед строкой :
, а значения идут после них - поэтому мы хотим читать построчно, разбивать на основе последовательностей в двоеточии, рассматривать то, что было впереди, как и обработайте то, что находится сзади, как значение.
Учитывая, что:
jq -Rn '[inputs | split(": ")] | reduce .[] as $kv ({}; .[$kv[0]] = $kv[1])' < <(write_output)
... правильно выбрасывает:
{
"Repo-id": "wazuh_repo",
"Repo-name": "Wazuhrepository",
"Repo-status": "enabled",
"Repo-revision": "1536348945",
"Repo-updated": "FriSep712:35:512018",
"Repo-pkgs": "73",
"Repo-size": "920M",
"Repo-baseurl": "https://packages.wazuh.com/3.x/yum/",
"Repo-expire": "21,600second(s)(last:WedOct3108:59:002018)"
}
... так, как это работает?
jq -R
включает необработанный ввод режим; входные данные анализируются как последовательность необработанных строк, а не как последовательность документов JSON.
jq -n
рассматривает null
как единственный прямой ввод, поэтому при необходимости можно использовать примитивы input
и inputs
внутри скрипта.
[ inputs ]
читает все ваши строки ввода и помещает их в один массив.
[ inputs | split(": ")]
изменяет это с массива строк на массив списков - с содержимым как до, так и после последовательности ": "
.
reduce .[] as $kv ( {}; ... )
запускает редуктор с начальным значением {}
, а затем подает каждое значение, которое оценивает .[]
(то есть каждый элемент в вашем списке) в это редуктор (код ...
) как переменная $kv
, заменяя значение .
каждый раз.
Чтобы запустить это с вашей командой yum в качестве реального ввода, измените < <(write_output)
на < <(yum -v repolist all | grep -B2 -A6 "enabled" | sed 's/[[:space:]]//g' , 's/--//g' , 's/name=name=/name=/g')
.