首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取密钥的字段名列表

提取密钥的字段名列表
EN

Stack Overflow用户
提问于 2018-12-04 15:31:55
回答 1查看 656关注 0票数 0

jq是一个很好的工具。如果我有json文件,我可以提取密钥列表。

就像这样:

代码语言:javascript
复制
jq keys filename | tr -d '][",'

例:

代码语言:javascript
复制
$jq  keys pipeline/components/devsvr.json  | tr -d '][",'
server1
server2

现在我想迭代每个键,只列出顶级的字段名(我正在为一些CloudFormation json文件编写一个非常简单的验证器)。

shell部分很简单--只是一个for循环,但我想不出如何对jq说:“只为x键显示所有字段名。

然后(在shell中)检查我所需的每个字段是否存在。顺便说一句,如果json格式错误,jq将报告错误,这也很有用。

下面是一个示例文件:

代码语言:javascript
复制
{
  "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的例子回答了我自己的问题,我用了这个例子,但这有点健康结果如下:

代码语言:javascript
复制
$jq  '.server1' /tmp/afile   | sed -n 's#^  \"\([^"]*\).*$#\1#p'
type
stage
descriptor

(这将在jq‘key’命令输出的循环中完成)。

更新:按照@匹克和阿龙的说法,我可以这样做:

代码语言:javascript
复制
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的存在是为了更严格的实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 16:04:38

..。使用尽可能小的工具集。

就处理JSON而言,您似乎只需要查看jq。

例如,可以将第一个命令简化为:

代码语言:javascript
复制
jq -r 'keys[]' devsvr.json

如果您想要按原来的顺序键,请使用keys_unsorted

更重要的是,可以(而且可能应该)在jq中迭代键。我不知道您的确切要求是什么,但是您应该能够很容易地适应以下内容:

代码语言:javascript
复制
jq -r '.[] | keys_unsorted[]' devsvr.json

它产生:

代码语言:javascript
复制
type
stage
descriptor
type
stage
descriptor

更新

根据对Q的更新,应考虑以下过滤器:

代码语言:javascript
复制
 keys[] as $serverName 
 | .[$serverName] 
 | "\($serverName) : \(keys|join(","))"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53616327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档