jq - 使用 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
在这种情况下往往会犯的一个可能的错误是将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,导致您的字符串针对每个匹配条件重复。
推荐阅读
- salesforce - 在 Salesforce LWC 中调用 Apex 时显示加载指示器
- powershell - 为 base64 基本身份验证标记化创建字符串时,Powershell 中出现意外结果
- java - 从数据库中访问 Java 程序生成的 CSV 文件
- avfoundation - 快速相机缩放
- mongodb - 按 $month 聚合和分组 mongodb 嵌套数据:
- c# - 重新导入我的项目,所有脚本和地形都消失了,我该如何解决这个问题?
- linux - 如何将 Linux 的查找、转换和复制命令合二为一
- android - Android 数据库测试 - 使用 Room.inMemoryDatabaseBuilder() 通过了与 Room.databaseBuilder() 完全相同的测试
- javascript - Chrome.Browser.Extension 错误:未捕获的 TypeError 和未检查的 runtime.lastError:
- grafana - InfluxQL/Grafana:每天获得最大值