jq是一个很好的工具。如果我有json文件,我可以提取密钥列表。
就像这样:
jq keys filename | tr -d '][",'例:
$jq keys pipeline/components/devsvr.json | tr -d '][",'
server1
server2现在我想迭代每个键,只列出顶级的字段名(我正在为一些CloudFormation json文件编写一个非常简单的验证器)。
shell部分很简单--只是一个for循环,但我想不出如何对jq说:“只为x键显示所有字段名。
然后(在shell中)检查我所需的每个字段是否存在。顺便说一句,如果json格式错误,jq将报告错误,这也很有用。
下面是一个示例文件:
{
"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的例子回答了我自己的问题,我用了这个例子,但这有点健康结果如下:
$jq '.server1' /tmp/afile | sed -n 's#^ \"\([^"]*\).*$#\1#p'
type
stage
descriptor(这将在jq‘key’命令输出的循环中完成)。
更新:按照@匹克和阿龙的说法,我可以这样做:
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的存在是为了更严格的实现。
发布于 2018-12-04 16:04:38
..。使用尽可能小的工具集。
就处理JSON而言,您似乎只需要查看jq。
例如,可以将第一个命令简化为:
jq -r 'keys[]' devsvr.json如果您想要按原来的顺序键,请使用keys_unsorted。
更重要的是,可以(而且可能应该)在jq中迭代键。我不知道您的确切要求是什么,但是您应该能够很容易地适应以下内容:
jq -r '.[] | keys_unsorted[]' devsvr.json它产生:
type
stage
descriptor
type
stage
descriptor更新
根据对Q的更新,应考虑以下过滤器:
keys[] as $serverName
| .[$serverName]
| "\($serverName) : \(keys|join(","))"https://stackoverflow.com/questions/53616327
复制相似问题