jq - 如何过滤不包含的json

Gav*_*hel 21 json jq

我有一个我要过滤的aws查询jq.我想过滤所有imageTags以"最新"结束

到目前为止,我做了这个,但它过滤包含"最新"的东西,而我想过滤不包含"最新"的东西(或不以"最新"结尾)

aws ecr describe-images --repository-name <repo> --output json | jq '.[]' | jq '.[]' | jq "select ((.imagePushedAt < 14893094695) and (.imageTags[] | contains(\"latest\")))"
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 31

您可以使用not反转逻辑

(.imageTags[] | contains(\"latest\") | not)
Run Code Online (Sandbox Code Playgroud)

另外,我想你可以简化你的管道到一个jq电话.


jas*_*ard 8

使用| not

一个有用的示例,特别是对于 Macbrew用户:

列出所有瓶装配方奶粉

通过查询 JSON 并解析输出

brew info --json=v1 --installed | jq -r 'map(
    select(.installed[].poured_from_bottle)|.name) | unique | .[]' | tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

列出所有非瓶装配方奶粉

通过查询 JSON 并解析输出并使用| not

brew info --json=v1 --installed | jq -r 'map(                                                                                                                          
  select(.installed[].poured_from_bottle | not) | .name) | unique | .[]'
Run Code Online (Sandbox Code Playgroud)


小智 5

在这种情况下contains()不能正常工作,最好使用notofindex()函数

select(.imageTags | index("latest") | not)
Run Code Online (Sandbox Code Playgroud)


cus*_*der 5

.[] | .[]可以缩短为.[][]例如

$ jq --null-input '[[1,2],[3,4]] | .[] | .[]'
1
2
3
4
$ jq --null-input '[[1,2],[3,4]] | .[][]'
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

要检查一个字符串是否不包含另一个字符串,您可以组合containsnot例如,

$ jq --null-input '"foobar" | contains("foo") | not'
false
$ jq --null-input '"barbaz" | contains("foo") | not'
true
Run Code Online (Sandbox Code Playgroud)

您可以使用字符串数组执行类似的操作,any例如all

$ jq --null-input '["foobar","barbaz"] | any(.[]; contains("foo"))'
true
$ jq --null-input '["foobar","barbaz"] | any(.[]; contains("qux"))'
false
$ jq --null-input '["foobar","barbaz"] | all(.[]; contains("ba"))'
true
$ jq --null-input '["foobar","barbaz"] | all(.[]; contains("qux"))'
false
Run Code Online (Sandbox Code Playgroud)

假设你有 file.json:

[ [["foo", "foo"],["foo", "bat"]]
, [["foo", "bar"],["foo", "bat"]]
, [["foo", "baz"],["foo", "bat"]]
]
Run Code Online (Sandbox Code Playgroud)

并且您只想保留没有任何字符串的嵌套数组"ba"

$ jq --compact-output '.[][] | select(all(.[]; contains("bat") | not))' file.json
["foo","foo"]
["foo","bar"]
["foo","baz"]
Run Code Online (Sandbox Code Playgroud)