从数组中选择值

69
我有一个带有示例值的JSON文件:
{
    "files": [{
        "fileName": "FOO",
        "md5": "blablabla"
    }, {
        "fileName": "BAR",
        "md5": "alaldlafj"
    }]
}

现在我想要的是返回md5值,例如文件名为"FOO"。为此,我在jq中有以下语句:
cat <file>.json | jq '.[] | select(.fileName=="FOO")' 

然而,返回的响应是:jq: error (at <stdin>:11): Cannot index array with string "fileName" 正确的方法是如何返回md5值,其中键fileName等于某个参数?
3个回答

83
找到答案了:
cat <file>.json | jq -r '.files[] | select(.fileName=="FOO") | .md5'

20
为什么要提到“猫”?你可以使用以下命令来获取file.json中文件名为“FOO”的MD5值:jq -r '.files[] | select(.fileName=="FOO") | .md5' <file.json> - Brent D.
8
@BrentD. - 你说得对,你的版本更短更简单。但是,有些人像我一样非常喜欢以 cat 开头的严格从左到右的结构,特别是涉及管道时。 - bitinerant
2
一个更短、更简单的行代码,保持严格的从左到右的顺序是:<file.json jq -r '.files[] | select(.fileName=="FOO") | .md5' - Scott Centoni

13

回答更常见的问题:如何从数组中选择所有文件名:

cat results.json | jq '.files[] | .filename'

问题是关于根据其他字段的值选择特定字段,而不是选择所有字段。 - Mika Riekkinen

7

或者:

cat <file>.json | jq -r '.files[] | select(.fileName=="FOO").md5'

9
欢迎来到 Stackoverflow!请考虑阅读此部分以改进您的答案。您能否为您在此处发布的代码提供一些解释? - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接