jq raw json выходной возврат каретки? - PullRequest
0 голосов
/ 03 октября 2018

Не стесняйтесь редактировать заголовок;не уверен, как это сказать.Я пытаюсь превратить вывод оболочки в данные JSON для системы отчетов, которую я пишу для работы.Быстрый вопрос, независимо от того, что я делаю, когда я беру необработанный ввод в режиме slurp и выводю JSON, последний элемент в массиве остается пустым ("").Я чувствую, что это какая-то проблема с новичком jq, с которой я сталкиваюсь, но не могу понять, как сформулировать проблему.Кажется, это происходит независимо от того, какую команду я запускаю на оболочке и канале для jq:

# rpm -qa | grep kernel | jq -R -s 'split("\n")'
[
  "kernel-2.6.32-504.8.1.el6.x86_64",
  "kernel-firmware-2.6.32-696.20.1.el6.noarch",
  "kernel-headers-2.6.32-696.20.1.el6.x86_64",
  "dracut-kernel-004-409.el6_8.2.noarch",
  "abrt-addon-kerneloops-2.0.8-43.el6.x86_64",
  "kernel-devel-2.6.32-358.11.1.el6.x86_64",
  "kernel-2.6.32-131.4.1.el6.x86_64",
  "kernel-devel-2.6.32-696.20.1.el6.x86_64",
  "kernel-2.6.32-696.20.1.el6.x86_64",
  "kernel-devel-2.6.32-504.8.1.el6.x86_64",
  "libreport-plugin-kerneloops-2.0.9-33.el6.x86_64",
  ""
]

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Предполагая, что у вас есть доступ к jq 1.5 или более поздней версии, вы можете полностью и экономично обойти проблему, используя inputs:

jq -nR '[inputs]'

Просто обязательно включите опцию -n, иначе первая строка будетпропадают без вести.

0 голосов
/ 03 октября 2018

Вы также можете использовать

rpm -qa | grep kernel | jq -R . | jq -s .

, чтобы получить желаемый результат.

Пожалуйста, см. https://github.com/stedolan/jq/issues/563

0 голосов
/ 03 октября 2018

Каждая строка заканчивается новой строкой.Либо удалите последний символ новой строки, либо пропустите пустой элемент в конце массива.

vnix$ printf 'foo\nbar\n' |
> jq -R -s '.[:-1] | split("\n")'
[
  "foo",
  "bar"
]

vnix$ printf 'foo\nbar\n' |
> jq -R -s 'split("\n")[:-1]'
[
  "foo",
  "bar"
]

Обозначение x[:-1] возвращает значение строки или массива x с последним удаленным элементом.Это называется «нотация среза».

Просто по буквам, если вы берете строку "foo\n" и разбиваете на новую строку, вы получаете "foo" до новой строки и "" после него.

Чтобы сделать это действительно надежным, возможно, обрежьте последний символ, только если это действительно перевод строки.

vnix$ printf 'foo\nbar\n' |
> jq -R -s 'sub("\n$";"") | split("\n")'
[
  "foo",
  "bar"
]

vnix$ printf 'foo\nbar' |
> #  notice, no final ^ newine
> jq -R -s 'sub("\n$";"") | split("\n")'
[
  "foo",
  "bar"
]
...