首页 > 解决方案 > 使用 jq 在满足过滤条件的索引处获取 JSON 数组对象

问题描述

我需要从 aws cli 的命令返回的 json 数组中获取整个对象list-action-executions,其中属性满足以下条件

"stageName": "DeployStage",
"actionName": "PromoteToProdApprovalGate",

awscli 命令的输出采用以下格式。实际输出包含大约40个数组元素和1个以上满足上述条件。我想将它们全部作为完整的对象。我怎样才能用 JQ 做到这一点?我尝试了选择和索引选项,但没有成功。

我的 jq 查询应该如何格式化?

谢谢

{
  "actionExecutionDetails": [
    {
      "pipelineExecutionId": "pipeline-exec-id-1",
      "actionExecutionId": "action-exec-id-1",
      "pipelineVersion": 2,
      "stageName": "DeployStage",
      "actionName": "PromoteToProdApprovalGate",
      "startTime": "2020-06-01T22:11:53-04:00",
      "lastUpdateTime": "2020-06-01T22:11:53-04:00",
      "status": "InProgress",
      "input": {
        "actionTypeId": {
          "category": "Approval",
          "owner": "AWS",
          "provider": "Manual",
          "version": "1"
        },
        "configuration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=#{SourceBuildVariables.BB_COMMIT_ID}",
          "ExternalEntityLink": "#{SourceBuildVariables.BB_URL}",
          "NotificationArn": "arn:aws:sns:us-east-1:"
        },
        "resolvedConfiguration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=bb-commit-id-1",
          "ExternalEntityLink": "url/bb-commit-id",
          "NotificationArn": "arn:aws:sns:us-east-1:"
        },
        "region": "us-east-1",
        "inputArtifacts": []
      },
      "output": {
        "outputArtifacts": [],
        "outputVariables": {}
      }
    },
    {
      "pipelineExecutionId": "pipeline-exec-id-2",
      "actionExecutionId": "action-exec-id-2",
      "pipelineVersion": 2,
      "stageName": "DeployStage",
      "actionName": "ImageEnvironmentTag",
      "startTime": "2020-06-01T22:09:45.833000-04:00",
      "lastUpdateTime": "2020-06-01T22:11:52.689000-04:00",
      "status": "Succeeded",
      "input": {
        "actionTypeId": {
          "category": "Build",
          "owner": "AWS",
          "provider": "CodeBuild",
          "version": "1"
        },
        "configuration": {
          "EnvironmentVariables": "[\n  { \"name\": \"LAST_ENV\", \"value\": \"qa\" },\n  { \"name\": \"BB_COMMIT_ID\", \"value\": \"#{SourceBuildVariables.BB_COMMIT_ID}\" }\n]\n",
          "ProjectName": "project-name-environement-tag"
        },
        "resolvedConfiguration": {
          "EnvironmentVariables": "[\n  { \"name\": \"LAST_ENV\", \"value\": \"qa\" },\n  { \"name\": \"BB_COMMIT_ID\", \"value\": \"bb-commit-id-1\" }\n]\n",
          "ProjectName": "projectName"
        },
        "region": "us-east-1",
        "inputArtifacts": [
          {
            "name": "PipelineArtifacts",
            "s3location": {
              "bucket": "bucket",
              "key": "key"
            }
          }
        ]
      },
      "output": {
        "outputArtifacts": [],
        "executionResult" : {
          "externalExecutionId": "externalExecutionId",
          "externalExecutionUrl": "https://console.aws.amazon.com/codebuild/home?region=us-east-1#/builds/"
        },
        "outputVariables": {}
      }
    },
    {
      "pipelineExecutionId": "",
      "actionExecutionId": "",
      "pipelineVersion": 2,
      "stageName": "DeployStage",
      "actionName": "PromoteToProdApprovalGate",
      "startTime": "2020-06-01T22:11:53-04:00",
      "lastUpdateTime": "2020-06-01T22:11:53-04:00",
      "status": "InProgress",
      "input": {
        "actionTypeId": {
          "category": "Approval",
          "owner": "AWS",
          "provider": "Manual",
          "version": "1"
        },
        "configuration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=#{SourceBuildVariables.BB_COMMIT_ID}",
          "ExternalEntityLink": "#{SourceBuildVariables.BB_URL}",
          "NotificationArn": "arn:aws:sns:us-east-1:"
        },
        "resolvedConfiguration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=xxx1",
          "ExternalEntityLink": "http://",
          "NotificationArn": "arn:aws:sns:us-east-1:"
        },
        "region": "us-east-1",
        "inputArtifacts": []
      },
      "output": {
        "outputArtifacts": [],
        "outputVariables": {}
      }
    },
    {
      "pipelineExecutionId": "",
      "actionExecutionId": "",
      "pipelineVersion": 1,
      "stageName": "DeployStage",
      "actionName": "PromoteToProdApprovalGate",
      "startTime": "2020-03-31T23:29:14.479000-04:00",
      "lastUpdateTime": "2020-04-03T19:04:51.646000-04:00",
      "status": "Succeeded",
      "input": {
        "actionTypeId": {
          "category": "Approval",
          "owner": "AWS",
          "provider": "Manual",
          "version": "1"
        },
        "configuration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=#{SourceBuildVariables.BB_COMMIT_ID}",
          "ExternalEntityLink": "#{SourceBuildVariables.BB_URL}",
          "NotificationArn": "arn:aws:sns:us-east-1:"
        },
        "resolvedConfiguration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=xxx2",
          "ExternalEntityLink": "http://",
          "NotificationArn": "arn:aws:sns:us-east-1:"
        },
        "region": "us-east-1",
        "inputArtifacts": []
      },
      "output": {
        "outputArtifacts": [],
        "executionResult": {
          "externalExecutionId": ",
          "externalExecutionSummary": "Approved by arn:aws:sts:"
        },
        "outputVariables": {}
      }
    },
    {
      "pipelineExecutionId": "",
      "actionExecutionId": "",
      "pipelineVersion": 1,
      "stageName": "DeployStage",
      "actionName": "PromoteToProdApprovalGate",
      "startTime": "2020-03-18T21:10:25.541000-04:00",
      "lastUpdateTime": "2020-03-25T21:10:25.965000-04:00",
      "status": "Failed",
      "input": {
        "actionTypeId": {
          "category": "Approval",
          "owner": "AWS",
          "provider": "Manual",
          "version": "1"
        },
        "configuration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=#{SourceBuildVariables.BB_COMMIT_ID}",
          "ExternalEntityLink": "#{SourceBuildVariables.BB_URL}",
          "NotificationArn": "arn:aws:sns:us-east-1"
        },
        "resolvedConfiguration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=xxx3",
          "ExternalEntityLink": "http://",
          "NotificationArn": "arn:aws:sns:us-east-1:"
        },
        "region": "us-east-1",
        "inputArtifacts": []
      },
      "output": {
        "outputArtifacts": [],
        "executionResult": {
          "externalExecutionId": ""
        },
        "outputVariables": {}
      }
    },
    {
      "pipelineExecutionId": "",
      "actionExecutionId": "",
      "pipelineVersion": 1,
      "stageName": "DeployStage",
      "actionName": "PromoteToProdApprovalGate",
      "startTime": "2020-03-09T19:23:43.637000-04:00",
      "lastUpdateTime": "2020-03-10T14:48:30.069000-04:00",
      "status": "Failed",
      "input": {
        "actionTypeId": {
          "category": "Approval",
          "owner": "AWS",
          "provider": "Manual",
          "version": "1"
        },
        "configuration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=#{SourceBuildVariables.BB_COMMIT_ID}",
          "ExternalEntityLink": "#{SourceBuildVariables.BB_URL}",
          "NotificationArn": "arn:aws:sns:us-east-1"
        },
        "resolvedConfiguration": {
          "CustomData": "Deploy Service to Prod Approval Required for CommitID=xxx4",
          "ExternalEntityLink": "http://",
          "NotificationArn": "arn:aws:sns:us-east-1:"
        },
        "region": "us-east-1",
        "inputArtifacts": []
      },
      "output": {
        "outputArtifacts": [],
        "executionResult": {
          "externalExecutionId": "",
          "externalExecutionSummary": ""
        },
        "outputVariables": {}
      }
    }
  ]
}

标签: jq

解决方案


人们jq在这种情况下往往会犯的一个可能的错误是将select()函数用于整个 JSON 本身,这将无法按预期工作。正确的过滤器是过滤阵列

.actionExecutionDetails[]
| select(.stageName == "DeployStage" and .actionName == "PromoteToProdApprovalGate")'

看到它在jq-play上工作

或者,如果您希望使用过滤结果更新原始数组,请执行此操作

.actionExecutionDetails |= 
map(select(.stageName == "DeployStage" and .actionName == "PromoteToProdApprovalGate"))

至于为什么你最初的尝试没有奏效,

.actionExecutionDetails[].actionName 
| select ( index("PromoteToProdApprovalGate") )

获取对象列表的路径表达式错误。您基本上是在.actionName字符串字段上进行选择,该字段在使用时select(index(..))返回一个布尔值 true,导致您的字符串针对每个匹配条件重复。


推荐阅读