Команда JQ выдает ошибку «не может перебрать строку», когда - PullRequest
0 голосов
/ 19 июня 2019

Я пишу сценарий bash, использующий jq для фильтрации записей JSON по заданным переменным bash и возвращения некоторых значений ключа из каждой записи в файл с разделителями табуляции. Я думаю, что первые несколько строк этой команды в порядке, но 4-я строка вызывает проблему. Я попытался передать каждую запись в строке 4 tostring, но безрезультатно.

info=`cat $FILE | jq -r \
    ' .[] \
    | map(select(.host| contains(env.A))) \
    | [."ip.A",."ts",."ip.B"] \
    | @tsv'`

Пример записи в формате JSON:

{
  "ts": "2019-06-19T00:00:00.000000Z",
  "ip.A": "0.0.0.0",
  "ip.B": "0.0.0.0",
  "host": "www.google.com",
}

В этих файлах нет скобок, окружающих весь текст в файле.

Ошибка дана:

jq: error (at <stdin>:0): Cannot iterate over string ("2019-06-18...)

Нужно ли обрабатывать ".ts" каким-то особым образом?

1 Ответ

2 голосов
/ 19 июня 2019

Этот код разбит длиной перед 3-й строкой.

  • Если нет внешнего массива или объекта, вы не можете использовать .[].
  • Если ваш тип данных является объектом, а не списком, то при использовании map() он выбрасывает данные (в частности, отбрасывает ключи, оставляя только значения).

...so, .[] перебирает значения в вашем объекте, а затем map() пытается перебрать каждое из этих значений, как если бы это был сам итеративный объект, а это не так ...ошибка.


Урезанная версия для удаления сломанных частей может выглядеть следующим образом:

a="google.com" jq -r '
if (.host | contains(env.a)) then
  [."ip.A",."ts",."ip.B"] | @tsv
else
  empty
end
' <<'EOF'
{
  "ts": "2019-06-19T00:00:00.000000Z",
  "ip.A": "0.0.0.0",
  "ip.B": "0.0.0.0",
  "host": "www.google.com"
}
EOF

..., которая отлично работает.

...