使用 jq 从 json 数据获取特定字符串

使用 jq 从 json 数据获取特定字符串

我只想要with下面的示例文件。

这仅供参考,无法在此处粘贴公司代码,因为它在安全环境中运行,因此不允许,但我的问题有些相似。我必须从值中获取特定的字符串。请帮忙

{
    "id": "0001",
    "type": "donut",
    "name": "Cake",
    "ppu": 0.55,
    "batters":
        {
            "batter":
                [
                    { "id": "1001", "type": "Regular" },
                    { "id": "1002", "type": "Chocolate" },
                    { "id": "1003", "type": "Blueberry" },
                    { "id": "1004", "type": "Devil's Food" }
                ]
        },
    "topping":
        [
            { "id": "5001", "type": "None" },
            { "id": "5002", "type": "Glazed" },
            { "id": "5005", "type": "Sugar" },
            { "id": "5007", "type": "Powdered Sugar" },
            { "id": "5006", "type": "**Chocolate with Sprinkles**" },
            { "id": "5003", "type": "Chocolate" },
            { "id": "5004", "type": "Maple" }
        ]
}

答案1

jq -r '.topping[] | select(.id == "5006").type / " " | .[1]' file.json

这会选择数组中与 string 相等的topping数组元素,并从中提取键的值。然后,它将该值拆分为空格并提取第二个生成的单词。它被输出、解码到标准输出。id5006type

如果/ " "看起来很有趣,您可以将该部分替换为| split(" "),它的作用更明确。或者| scan("\\S+")提取非空白字符序列,以防字符串中存在前导空格或尾随空格,或者除空格之外的其他空白字符或单词之间存在多个空白字符。

如果您不确定在哪里在您的文档中,该字符串是,但它是具有且等于该字符串type的对象的值,那么您可以使用id5006

jq -r '.. | select(.id? == "5006").type / " " | .[1]' file.json

这会迭代所有值和键(因此效率非常低)并选择具有idvalue 的键的任何内容5006。然后它就像上面最上面的变体一样进行。

with给定问题中的数据,任一表达式都会在标准输出上生成单词。

答案2

您没有提供您知道的信息,例如键的名称等,但如果您也允许使用 cut,这是我的最佳猜测:

cat testjq.json | jq -r '.topping[] | select(.id == "5006" )' | grep type | cut -d "\"" -f 4 | cut -d " " -f 2

相关内容