Я пытаюсь отфильтровать свои экземпляры aws ec2 по ключу тега. Я хочу получить результат, что у экземпляра ec2 нет определенного ключа (в моем примере это env или appname)
aws ec2 describe-instances | jq -c '.Reservations[].Instances[] | select(contains({Tags: [{Key:"env"}]}, {Tags:[{Key:"AppName"}]} | not) | {instanceId: .InstanceId, tags: .Tags}'
который возвращает Однако я заметил, что я смешал прописные и строчные буквы в ключе, например
{
{
"InstanceId": "t-1234",
"Tags": [
{"Key": "Name",
"Value": "Foo"},
{"Key": "env",
"Value": "prod"}
]
},
{
"InstanceId": "t-1235",
"Tags": [
{"Key": "Name",
"Value": "Bar"},
{"Key": "Env",
"Value": "prod"},
{"Key": "AppName",
"Value": "BarApp"}
]
},
{
"InstanceId": "t-1236",
"Tags": [
{"Key": "Name",
"Value": "Bar"},
]
},
}
В этом примере мой желаемый результат будет,
{
{ // this instance does not have AppName
"InstanceId": "t-1234",
"Tags": [
{"Key": "Name",
"Value": "Foo"},
{"Key": "env",
"Value": "prod"}
]
},
{ // this instance does not have AppName and env
"InstanceId": "t-1236",
"Tags": [
{"Key": "Name",
"Value": "Bar"},
]
},
}
Я искал и читал, что мне нужно использовать либо ascii_downcase
, либо ascii_uppercase
, но мне не удается применить. Как я могу улучшить свой оператор jq, чтобы я мог фильтровать экземпляры ec2, которые не имеют определенного ключа без учета регистра (например, env
или ENV
или Env
)?
Спасибо
@peak Несмотря на то, что у t-1234
есть тег с .Key, равным env
, у него нет AppName
, который я хочу отфильтровать из моего объекта json. Пожалуйста, дайте мне знать, если это все еще неясно.
Мое понимание описания проблемы (в отличие от примера) приводит меня к этой программе jq:
map(select( any(.Tags[]; .Key | ascii_downcase | IN( "env", "appname")) | not))
Надеемся, что использование здесь any
и IN
приведет вас к желаемой формулировке.
Пожалуйста, следуйте рекомендациям минимальный воспроизводимый пример. В частности, ваш образец не является допустимым JSON. Кроме того, объект с .InstanceId, равным «t-1234», имеет тег с .Key, равным «env», что является одним из значений, которое должно исключать объект. Поэтому, пожалуйста, уточните требования.