JQ错误:在尝试向jq模板添加值时未在<top-level>定义

时间:2018-05-03 19:25:19

标签: json templates jq

我有一个.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
    }
  ]
}

我的shell脚本如下所示,我基本上运行一个命令来提取一些memcached输出统计信息,并希望将一些结果作为键/值插入到jq模板中。

&#13;
&#13;
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
&#13;
&#13;
&#13;

不确定这是否是处理此方案的最佳方式,但我遇到了大量错误,例如:

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 :(得分:0)

如果你要使用-f template.jq调用jq,那么template.jq中的每个$ -variables都必须在命令行上单独设置,逐个 。在你的情况下,这看起来不是一个非常愉快的选择。

如果你按原样坚持使用template.jq,那么除了在命令行上设置$ -variables之外还有其他选择,它会很难实现。

有关使用$ -variables的替代方法,请参阅jq Cookbook中的https://github.com/stedolan/jq/wiki/Cookbook#using-jq-as-a-template-engine。例如,考虑这个&#34;解构&#34;:

这个例子的含义
jq -nc '{a:1,b:2} as {a: $a, b:$b} | [$a,$b]'
[1,2]  

另一种选择

在您的特定情况下,您可以替换所有&#34; $&#34; template.jq中带有&#34;。&#34;的字符,然后使用适当的密钥传入JSON对象;例如将$uptime更改为.uptime,然后为uptime添加键/值对。