我有一个要在jq
中过滤的aws查询。
我想过滤不以“最新”结尾的所有imageTags
到目前为止,我做了这个,但它过滤了包含“最新”的内容,而我想过滤不包含“最新”的内容(或不以“最新”结尾)
aws ecr describe-images --repository-name <repo> --output json | jq '.[]' | jq '.[]' | jq "select ((.imagePushedAt < 14893094695) and (.imageTags[] | contains(\"latest\")))"
由于
答案 0 :(得分:21)
您可以使用not
来反转逻辑
(.imageTags[] | contains(\"latest\") | not)
另外,我想你可以将你的管道简化为一个jq
电话。
答案 1 :(得分:0)
这种情况下contains()
不能正常工作,最好使用not
函数的index()
select(.imageTags | index("latest") | not)
答案 2 :(得分:0)
这个 .[] | .[]
可以缩短为 .[][]
例如,
$ jq --null-input '[[1,2],[3,4]] | .[] | .[]'
1
2
3
4
$ jq --null-input '[[1,2],[3,4]] | .[][]'
1
2
3
4
要检查一个字符串是否不包含另一个字符串,您可以组合 contains
和 not
例如,
$ jq --null-input '"foobar" | contains("foo") | not'
false
$ jq --null-input '"barbaz" | contains("foo") | not'
true
您可以使用 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
假设你有 file.json:
[ [["foo", "foo"],["foo", "bat"]]
, [["foo", "bar"],["foo", "bat"]]
, [["foo", "baz"],["foo", "bat"]]
]
并且您只想保留没有任何带有 "ba"
的字符串的嵌套数组:
$ jq --compact-output '.[][] | select(all(.[]; contains("bat") | not))' file.json
["foo","foo"]
["foo","bar"]
["foo","baz"]
答案 3 :(得分:0)
subprocess.run([powershellExeLocation, "-File", powershellScriptLocationWithSpaces])
内| not
一个有用的例子,特别是对于 mac jq
用户:
通过查询 JSON 并解析输出
brew
通过查询 JSON 并解析输出并使用 brew info --json=v1 --installed | jq -r "map(select(.installed[].poured_from_bottle) | .name) | unique | .[]" | tr '\n' ' '
| not