Ошибка JQ: не определена на <верхнем уровне> при попытке добавить значения в шаблон jq - PullRequest
0 голосов
/ 03 мая 2018

У меня есть шаблон .jq, который я хочу обновить в списке образцов в формате:

{
  "test": "abc",
  "p": "1",
  "v": "1.0.0",
  "samples": [
    {
      "uptime": $uptime,
      "curr_connections": $curr_connections,
      "listen_disabled_num": $listen_disabled_num,
      "conn_yields": $conn_yields,
      "cmd_get": $cmd_get,
      "cmd_set": $cmd_set,
      "bytes_read": $bytes_read,
      "bytes_written": $bytes_writtem,
      "get_hits": $get_hits,
      "rejected_connections": $rejected_connections,
      "limit_maxbytes": $limit_maxbytes,
      "cmd_flush": $cmd_flush
    }
  ]
}

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

JQ=`cat template.jq`

SAMPLES=(uptime curr_connections listen_disabled_num conn_yields cmd_get cmd_set cmd_flush bytes_read bytes_written get_hits rejected_connections limit_maxbytes)

for metric in ${SAMPLES[*]}
do
  KEY=$(echo stats | nc $HOST $PORT | grep $metric | awk '{print $2}')
  VALUE=$(echo stats | nc $HOST $PORT | grep $metric | awk '{print $3}')

  echo "Using KEY: $KEY with value: $VALUE"

  jq -n --argjson $KEY $VALUE -f template.jq
done

Не уверен, что это лучший способ справиться с этим сценарием, но я получаю массу ошибок, таких как:

jq: error: conn_yields/0 is not defined at <top-level>, line 12:
      "conn_yields": $conn_yields,
jq: error: cmd_get/0 is not defined at <top-level>, line 13:
      "cmd_get": $cmd_get,
jq: error: cmd_set/0 is not defined at <top-level>, line 14:
      "cmd_set": $cmd_set,

1 Ответ

0 голосов
/ 03 мая 2018

Если вы собираетесь вызывать jq, используя -f template.jq, то каждая из $-переменных в template.jq должна быть установлена ​​ отдельно в командной строке, одна за другой. В вашем случае это не выглядит очень счастливым вариантом.

Если вы застряли с шаблоном template.jq как есть, это будет сложно, хотя есть и другие варианты, кроме установки $ -variables в командной строке.

Пожалуйста, смотрите https://github.com/stedolan/jq/wiki/Cookbook#using-jq-as-a-template-engine в jq Cookbook для альтернативы использованию $ -переменных. Рассмотрим, например, значение этой иллюстрации «разрушения»:

jq -nc '{a:1,b:2} as {a: $a, b:$b} | [$a,$b]'
[1,2]  

Другая альтернатива

В вашем конкретном случае вы можете заменить все символы "$" в template.jq на ".", А затем передать объект JSON с соответствующими ключами; например измените $uptime на .uptime, а затем включите пару ключ / значение для uptime.

...