我有一个.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模板中。
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,
答案 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
添加键/值对。