[英]Looping over a list of keys to extract from a JSON file with jq
我试图在jq中提取一系列属性(在输入文件中命名),并在通过循环从bash馈入这些属性时遇到错误:
while read line; do echo $line; cat big.json | jq ".$line"; sleep 1; done < big.properties.service
cfg.keyload.service.count
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
当我尝试手动进行操作时
$ line=cfg.keyload.service.count
$ echo $line
cfg.keyload.service.count
$ cat big.json | jq ".$line"
1
有什么办法可以使其循环工作?
这是例子
cat >big.json <<EOF
{
"cfg": {
"keyload": {
"backend": {
"app": {
"shutdown": {
"timeout": "5s"
},
"jmx": {
"enable": true
}
}
}
}
}
}
EOF
cat >big.properties.service <<EOF
cfg.keyload.backend.app.shutdown.timeout
cfg.keyload.backend.app.jmx.enable
cfg.keyload.backend.app.jmx.nonexistent
cfg.nonexistent
EOF
...输出应为:
cfg.keyload.backend.app.shutdown.timeout
"5s"
cfg.keyload.backend.app.jmx.enable
true
cfg.keyload.backend.app.jmx.nonexistent
null
cfg.nonexistent
null
这里的“无效字符”几乎可以肯定是回车。 使用dos2unix
将您的输入文件转换为正确的UNIX文本文件,您的原始代码将起作用(尽管效率很低,每次要提取单个属性时都重新big.json
整个big.json
)。
根本不要为此使用bash循环-让jq
进行循环会更有效。
请注意此代码中使用的sub("\\r$"; "")
来删除尾随的回车符,以便它可以接受DOS格式的输入。
jq -rR --argfile infile big.json '
sub("\r$"; "") as $keyname
| ($keyname | split(".")) as $pieces
| (reduce $pieces[] as $piece ($infile; .[$piece]?)) as $value
| ($keyname, ($value | tojson))
' <big.properties.service
当给出问题的输入时,正确地发出作为输出:
cfg.keyload.backend.app.shutdown.timeout
"5s"
cfg.keyload.backend.app.jmx.enable
true
cfg.keyload.backend.app.jmx.nonexistent
null
cfg.nonexistent
null
您的属性文件实际上是您要从中检索值的json中的路径。 将它们转换为jq
识别的路径,以便获得这些值。 只需排列一系列需要遍历的键即可。 由于它不是json,因此请确保将属性文件读取为原始输入( -R
),并使用原始输出( -r
)来输出所需的路径。
$ jq --argfile big big.json '
., (split(".") as $p | $big | getpath($p) | tojson)
' -Rr big.properties.service
cfg.keyload.backend.app.shutdown.timeout
"5s"
cfg.keyload.backend.app.jmx.enable
true
cfg.keyload.backend.app.jmx.nonexistent
null
cfg.nonexistent
null
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.