我试图从bash中的字符串创建一个json对象。字符串如下。
CONTAINER|CPU%|MEMUSAGE/LIMIT|MEM%|NETI/O|BLOCKI/O|PIDS
nginx_container|0.02%|25.09MiB/15.26GiB|0.16%|0B/0B|22.09MB/4.096kB|0
输出来自docker stats命令,我的最终目标是将自定义指标发布到AWS CloudWatch。我想将此字符串格式化为json。
{
"CONTAINER":"nginx_container",
"CPU%":"0.02%",
....
}
我以前使用过jq命令,似乎在这种情况下应该可以正常工作,但是我还没有想出一个好的解决方案。除了使用sed或awk对变量名进行硬编码和索引编制之外。然后从头开始创建一个json。任何建议,将不胜感激。谢谢。
对于以下所有内容,假定您的内容位于名为的shell变量中s
:
s='CONTAINER|CPU%|MEMUSAGE/LIMIT|MEM%|NETI/O|BLOCKI/O|PIDS
nginx_container|0.02%|25.09MiB/15.26GiB|0.16%|0B/0B|22.09MB/4.096kB|0'
# thanks to @JeffMercado and @chepner for refinements, see comments
jq -Rn '
( input | split("|") ) as $keys |
( inputs | split("|") ) as $vals |
[[$keys, $vals] | transpose[] | {key:.[0],value:.[1]}] | from_entries
' <<<"$s"
这需要非常新的(可能是1.5?)jq
才能工作,并且是一堆密集的代码。分解:
-n
阻止jq
自己读取stdin,而让input
and 可以读取整个输入流inputs
-前者读取一行,而后者读取所有其余行。(-R
,对于原始输入,导致读取文本行而不是JSON对象)。[$keys, $vals] | transpose[]
,我们生成了[key, value]
对(以Python的术语来说,将两个列表压缩在一起)。{key:.[0],value:.[1]}
,我们将每一[key, value]
对变成以下形式的对象{"key": key, "value": value}
from_entries
,我们将这些对组合为包含这些键和值的对象。这jq
将比上述版本更旧,并且在本地jq
解决方案可能更难以解决的情况下是一种易于采用的方法:
{
IFS='|' read -r -a keys # read first line into an array of strings
## read each subsequent line into an array named "values"
while IFS='|' read -r -a values; do
# setup: positional arguments to pass in literal variables, query with code
jq_args=( )
jq_query='.'
# copy values into the arguments, reference them from the generated code
for idx in "${!values[@]}"; do
[[ ${keys[$idx]} ]] || continue # skip values with no corresponding key
jq_args+=( --arg "key$idx" "${keys[$idx]}" )
jq_args+=( --arg "value$idx" "${values[$idx]}" )
jq_query+=" | .[\$key${idx}]=\$value${idx}"
done
# run the generated command
jq "${jq_args[@]}" "$jq_query" <<<'{}'
done
} <<<"$s"
jq
上面调用的命令类似于:
jq --arg key0 'CONTAINER' \
--arg value0 'nginx_container' \
--arg key1 'CPU%' \
--arg value1 '0.0.2%' \
--arg key2 'MEMUSAGE/LIMIT' \
--arg value2 '25.09MiB/15.26GiB' \
'. | .[$key0]=$value0 | .[$key1]=$value1 | .[$key2]=$value2' \
<<<'{}'
…将每个键和值带外传递(这样就将其视为文字字符串而不是解析为JSON),然后分别引用它们。
以上任何一种都会发出:
{
"CONTAINER": "nginx_container",
"CPU%": "0.02%",
"MEMUSAGE/LIMIT": "25.09MiB/15.26GiB",
"MEM%": "0.16%",
"NETI/O": "0B/0B",
"BLOCKI/O": "22.09MB/4.096kB",
"PIDS": "0"
}
简而言之: 因为可以保证生成有效的JSON作为output 。
考虑以下示例,该示例将打破更多幼稚的方法:
s='key ending in a backslash\
value "with quotes"'
当然,这些是意外情况,但是jq
知道如何处理它们:
{
"key ending in a backslash\\": "value \"with quotes\""
}
…而一个不理解JSON字符串的实现很容易最终发出:
{
"key ending in a backslash\": "value "with quotes""
}
问题内容: 我试图从bash中的字符串创建一个json对象。字符串如下。 输出来自docker stats命令,我的最终目标是将自定义指标发布到AWS CloudWatch。我想将此字符串格式化为json。 我以前使用过jq命令,似乎在这种情况下应该可以正常工作,但是我还没有能够提出一个好的解决方案。除了使用sed或awk对变量名进行硬编码和索引编制以外。然后从头开始创建一个json。任何建议,将
问题内容: 我有一个想要修改特定值的json,但是终端总是显示带有修改后值的json,但实际上并不会更改特定文件中的值。样本json: 我想更改文件本身中的address的值,但到目前为止,我一直无法更改。我尝试使用: 但这没用。有什么建议? 问题答案: AFAIK 不支持就地编辑,因此您必须先重定向到一个临时文件,然后再用它替换原始文件,或者使用moreutils包中的实用程序,如下所示: 还有
我有一个LinkedHashMap,我正在尝试拆分它的键和值,并引用键集中的特定键或值集中的值。例如,假设我有以下LinkedHashMap: 4 |2 3|1 我想要一个函数返回1,这是一个集合中索引为1的值,或者对于索引= 0返回2。对于另一个函数,我想得到键值为3,索引为1的键值。所以基本上从LinkedHashMap创建一个只有值/键的数组,然后在这个数组中寻找某个给定的位置。我的代码如下
我有一个多项目分级建筑在当地工作。有一个父级文件build.gradle设置。gradle文件将项目分配给它们各自的分级生成文件: 错误仍然相同,build.gradle文件(父文件)无法识别依赖项任务查看调试语句,找到并识别子生成分级文件:使用生成文件'/var/../LoadRemote/RemoteLoad_build.gradle'计算项目':LoadRemote'。对加载构建文件显示相同
问题内容: 我们正在接收一个输入参数值,它是一个由竖线分隔的键值对,并用符号分隔。例如: 因此格式为: 我需要将其拆分为JSON对象。所以,我的对象应该是: 什么是最好的方法,因为有多种选择: 我可以使用split with,并再次对每个元素使用split 。 我可以依靠正则表达式并进行字符串替换。 使用删除尾随符号对其进行拆分,然后将两个不同的数组与索引相关联。 谁能告诉我用JavaScript
问题内容: 我试图用来构造一个哈希值,其中键名来自变量。像这样: 但是,这不起作用,并出现以下错误: 问题答案: 使用括号可以尽早评估: