Get JSON array object at index satisfying a filter condition using jq

偶尔善良 提交于 2020-06-17 09:59:27

问题


I need to get the entire object(s) in json array returned by list-action-executions command from aws cli, where the attributes satisfy the condition below

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

The output from the awscli command is of the format. The actual output contains about 40 array elements and more than 1 satisfying the above conditions. I would like to get all of them as full objects. How can I do it with JQ? I tried the select and index options, but was not successful.

How should my jq query be formatted?

Thank you

{
  "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": {}
      }
    }
  ]
}

回答1:


One likely mistake people tend to do with jq on such situations is to use the select() function to the entire JSON itself which would not work as expected. The right filter would be to filter on the array

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

See it working on jq-play

Or if you want the original array updated with the filtered result, do this

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

As for why your original attempt didn't work,

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

the path expression to get the objects list is wrong. You are basically selecting on the .actionName string field which when used with select(index(..)) returns a bool value true, causing your string to repeat for each match condition.



来源:https://stackoverflow.com/questions/62235507/get-json-array-object-at-index-satisfying-a-filter-condition-using-jq

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!