繁体   English   中英

循环遍历要使用jq从JSON文件中提取的密钥列表

[英]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 )。

性能实现-在JQ中循环,而不是Bash

根本不要为此使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM