繁体   English   中英

用于从非结构化 JSON 文件中提取所有特定键值的 Bash 脚本

[英]Bash script to extract all specific key values from a unstructured JSON file

我试图从以下 JSON 文件中的特定键中提取所有值。

{
  "tags": [
    {
      "name": "xxx1",
      "image_id": "yyy1"
    },
    {
      "name": "xxx2",
      "image_id": "yyy2"
    }
  ]
}

我使用下面的代码来获取 image_id 键值。

echo new.json | jq '.tags[] | .["image_id"]'

我收到以下错误消息。

parse error: Invalid literal at line 2, column 0

我认为要么 JSON 文件格式不正确,要么调用 Json 文件的 echo 命令是错误的。

鉴于上述输入,我的预期/期望输出是:

yyy1
yyy2

需要修复什么才能实现这一点?

当你运行:

echo new.json | jq '.tags[] | .["image_id"]'

...字符串new.json - 不是名为new.json的文件的内容 - 被送到jq的stdin,因此它试图解析为JSON文本。

相反,运行:

jq -r '.tags[] | .["image_id"]' <new.json

...直接打开连接到jq的stdin的new.json (和-r ,以避免在输出流中添加不需要的引号)。

此外,您可能想尝试一种替代方法来使用JSON: jtc的walk-path unix工具。 有了那个你的问题看起来像这样:

bash $ <new.json jtc -w'[tags][:][image_id]'
"yyy1"
"yyy2"
bash $ 

但是,你的new.json不是非结构化的,相反它的结构很好。 如果你的new.json确实是不规则的(非结构化),那么以下查询将更好地工作:

bash $ <new.json jtc -w'<image_id>l:'
"yyy1"
"yyy2"
bash $ 
  1. 你的过滤器.tags[] | .["image_id"] .tags[] | .["image_id"]

是有效的,但可以缩写为:

.tags[] | .image_id

甚至:

.tags[].image_id
  1. 如果您想要与“image_id”键关联的值,无论该键出现在何处,您都可以使用:

    .. | objects | select(has("image_id")) | .image_id

或者,如果您不介意丢弃false和null值:

.. | .image_id? // empty

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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