首页 > 解决方案 > 如何使用 JQ 正确过滤

问题描述

我有这个:

{
  "LaunchTemplateVersions": [
    {
      "LaunchTemplateId": "lt-xxxxxx",
      "LaunchTemplateName": "dev-xxxxxx",
      "VersionNumber": 1,
      "VersionDescription": "dev-xxxxx",
      "CreateTime": "2021-04-28T06:12:15+00:00",
      "CreatedBy": "arn:aws:sts::xxxxx",
      "DefaultVersion": true,
      "LaunchTemplateData": {
        "BlockDeviceMappings": [
          {
            "DeviceName": "/dev/xvda",
            "Ebs": {
              "Encrypted": true,
              "DeleteOnTermination": true,
              "KmsKeyId": "arn:aws:kms:xxxx",
              "SnapshotId": "snap-xxxx",
              "VolumeSize": 800,
              "VolumeType": "gp2"
            }
          }

我需要获取以下值:

正在做:jq -r '.LaunchTemplateVersions[].LaunchTemplateData[].DeviceName'

确实返回:无法使用字符串“DeviceName”索引数组

我想问题是我怎样才能做到这一点,但我怎样才能自己理解 JQ 过滤,比如知道规则等

标签: jq

解决方案


假设说明性输入已以明显的方式更正,使其成为有效的 JSON,则调用:

jq -r '
  .LaunchTemplateVersions[].LaunchTemplateData.BlockDeviceMappings[]
  | (.DeviceName, .Ebs.KmsKeyId,.Ebs.VolumeSize)' input.json

会产生:

/dev/xvda
arn:aws:kms:xxxx
800

学习资源

既然你问到了学习资源,让我提一下,除了jq wiki上提到的资源之外,你可能还想浏览一下我写的指南:A Stream-Oriented Introduction to jq


推荐阅读