Json提取键的字段名列表

Json提取键的字段名列表,json,linux,shell,jq,Json,Linux,Shell,Jq,jq是一个很好的工具。如果我有一个json文件,我可以提取密钥列表 像这样: jq keys filename | tr -d '][",' 例如: 现在我想迭代每个键,只列出顶级字段名,我正试图为一些CloudFormation json文件编写一个非常简单的验证器 shell部分很简单——只是一个for循环,但我不知道如何对jq说:只显示键x的所有字段名 然后,我将在shell中检查我需要的每个字段是否存在。另外,如果json格式不正确,jq将报告一个错误,这也很有用 下面是一个示例文件:

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

像这样:

jq keys filename | tr -d '][",'
例如:

现在我想迭代每个键,只列出顶级字段名,我正试图为一些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 keys来获得键列表,然后对其进行迭代。我可能已经用我评论过的sed示例回答了我自己的问题,但这有点像海事组织的heath robinson。结果如下:

$jq  '.server1' /tmp/afile   | sed -n 's#^  \"\([^"]*\).*$#\1#p'
type
stage
descriptor
这将在jq'keys'命令的输出周围形成一个循环

更新:根据@peak和@Aaron,我可以这样做:

jq -r '. as $in | keys[] | . as $serverName | $in[$serverName] | keys | join(",") | "\($serverName) : \(.)"' pipeline/components/devsvr.json
devsvr : descriptor,stage,type
devsvr1 :
有更严格实施的限制条件

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

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

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

jq -r 'keys[]' devsvr.json
如果希望关键帧按原始顺序排列,请使用未排序的关键帧

更重要的是,迭代键可以而且可能应该在jq中完成。我不确定您的具体要求是什么,但您应该能够轻松地适应以下要求:

jq -r '.[] | keys_unsorted[]' devsvr.json
产生:

type
stage
descriptor
type
stage
descriptor
使现代化 根据Q的更新,应考虑以下过滤器:

 keys[] as $serverName 
 | .[$serverName] 
 | "\($serverName) : \(keys|join(","))"

请在您的问题中包含输入文件的摘录和所需结果的示例。我可能会依赖jq的输出格式,并搜索以2个空格开头的行-例如:jq'.devsvr'pipeline/components/devsvr.json | sed-n's^\[^]*.*$\1p'您正在将轮子重新改造为正方形:添加了一个示例文件和代码,如下所示:@oguzismail@ke2mgl是的,我明白你的意思——只是这是一件非常快速和简单的事情。我不需要编写模式。虽然这是CloudFormation,所以其他人一定已经这么做了-我知道有Amazon cli命令aws CloudFormation validate,但是cli没有安装在相关服务器上。这是一个快速测试,如果它无效,立即停止测试,使用尽可能小的工具集。可能类似。作为$in | keys[]|。作为[$serverName]| key | join中的$serverName |$。保留服务器节点与其字段名称之间的关联。谢谢,两者都是-这正是我想要做的-尤其是@Aaron的添加。我这样做:jq-r。作为$in | keys[]|。作为[$serverName]| keys | join中的$serverName |$in,|$serverName:.'pipeline/components/devsvvr.json devsvvr:descriptor,stage,键入devsvvr1:
 keys[] as $serverName 
 | .[$serverName] 
 | "\($serverName) : \(keys|join(","))"