Eu tenho um arquivo json com uma carga de logs do AWS CloudWatch (gerados a partir de um comando da CLI). Estou tentando usar o jq para retornar apenas valores para entradas que não possuem um campo 'retentionInDays'. Eu tenho o seguinte que retorna tudo como eu quero, mas não consigo filtrar os resultados que têm retençãoInDays.
# Working output (unfiltered)
jq ".logGroups[] | { log_name: .logGroupName, log_arn: .arn, retention_scheme: .retentionInDays }" cwlogs.json
Eu tentei algumas coisas, mas recebo um erro ou ele conclui e não gera nada:
# Doesn't return anything
jq '.logGroups[] | { log_name: .logGroupName, log_arn: .arn, retention_scheme: select(.retentionInDays | contains ("null")?) }' cwlogs.json
# Errors with "jq: error (at cwlogs.json:760): number (7) and string ("null") cannot have their containment checked"
jq '.logGroups[] | { log_name: .logGroupName, log_arn: .arn, retention_scheme: select(.retentionInDays | contains ("null")) }' cwlogs.json
# Hangs forever
jq '.logGroups[] | select(.retentionInDays != "null").type'
Atualização: segmento testável do JSON que estou usando
{
"logGroups": [
{
"storedBytes": 0,
"metricFilterCount": 0,
"creationTime": 1234,
"logGroupName": "/aws/elasticbeanstalk/docker",
"retentionInDays": 7,
"arn": "longarnhere"
},
{
"storedBytes": 0,
"metricFilterCount": 0,
"creationTime": 1245,
"logGroupName": "/aws/elasticbeanstalk/nginx",
"arn": "longarnhere"
}
]
}
Estou assumindo que você deseja obter as
logGroups
entradas que não possuem umaretentionInDays
chave.Se você quiser uma matriz destes (provavelmente, se houver mais de um):
Você também pode usar
has("retentionInDays") | not
no lugar dehas("retentionInDays") == false
.Você pode usar o operador alternativo:
//
.Por exemplo:
Ou, no seu exemplo, a filtragem pode ser feita adicionando
type
também ao filtro: