JQ отличный инструмент.Если у меня есть файл json, я могу извлечь список ключей
примерно так:
jq keys filename | tr -d '][",'
например:
$jq keys pipeline/components/devsvr.json | tr -d '][",'
server1
server2
Теперь я хотел бы повторитьнад каждым ключом, перечисляя только имена полей верхнего уровня (я пытаюсь написать очень простой валидатор для некоторых json-файлов CloudFormation).
Оболочка проста - просто цикл for, но я могуне понять, как сказать jq: «покажи мне все имена полей только для ключа x.
Я тогда (в оболочке) проверим, присутствует ли каждое требуемое поле.jq сообщит с ошибкой, если json деформирован, что также полезно.
Вот пример файла:
{
"server1": {
"type": "single-instance",
"stage": "10default",
"descriptor": {
"Resources": {
"Instance": {
"Properties": {
"InstanceType": "t2.medium",
"ImageId": {
}
}
},
"Metadata": {
"AWS::CloudFormation::Init": {
"app": {
"packages": {
"yum": {
"tmux": [],
"vim": []
}
},
"files": {
"sources": {},
"commands": {},
"services": {}
}
}
}
}
}
}
},
"server2": {
"type": "single-instance",
"stage": "10default",
"descriptor": {
"Resources": {
"Instance": {
"Properties": {
"InstanceType": "t2.medium",
"ImageId": {
}
}
},
"Metadata": {
"AWS::CloudFormation::Init": {
"app": {
"packages": {
"yum": {
"tmux": [],
"vim": []
}
},
"files": {
"sources": {},
"commands": {},
"services": {}
}
}
}
}
}
}
}
}
Так что в приведенном выше примере я бы запустил ключи jqчтобы получить список ключей, а затем повторить это. Возможно, я ответил на свой вопрос с примером sed, с которым я прокомментировал, но это немного хит-робинсон, IMO. Вот результат:
$jq '.server1' /tmp/afile | sed -n 's#^ \"\([^"]*\).*$#\1#p'
type
stage
descriptor
(это было бы в цикле вокруг вывода команды jq 'keys').
Обновление: согласно @peak aи @ Аарон, я могу сделать это:
jq -r '. as $in | keys[] | . as $serverName | $in[$serverName] | keys | join(",") | "\($serverName) : \(.)"' pipeline/components/devsvr.json
devsvr : descriptor,stage,type
devsvr1 :
с условием, что http://json -schema.org существует для более строгой реализации.