In a bash shell script, I want to extract Arn
, DefaultVersionId
from following JSON where Arn
string contains word akshay:
[
{
"PolicyName": "my-buckets-all",
"PolicyId": "ABCDEF",
"Arn": "arn:aws:iam::12345:policy/my-buckets-all",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 0,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "2022-05-14T01:17:13 00:00",
"UpdateDate": "2022-05-14T01:17:13 00:00"
},
{
"PolicyName": "akshay-buckets-all",
"PolicyId": "GHIJK",
"Arn": "arn:aws:iam::12345:policy/akshay-buckets-all",
"Path": "/",
"DefaultVersionId": "v4",
"AttachmentCount": 1,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "2022-05-20T21:20:10 00:00",
"UpdateDate": "2022-07-28T19:15:09 00:00"
}
]
I am fiddling with jq
to get this done. When tried with following, I just get the Arn
and not DefaultVersionId
:
.[] | .Arn, .DefaultVersionId | select(contains("akshay"))
How to go about it?
jqplay
fiddle here: https://jqplay.org/s/gp1DYAG-rgU
CodePudding user response:
You need to filter the required objects first (based on your condition) and then extract the fields needed, i.e.
map( select( .Arn | contains( "akshay" ) )? )[] | .Arn, .DefaultVersionId
gets you the values on a multi-line output. To get the values on the same line separated by a single whitespace use "\(.Arn) \(.DefaultVersionId)"
after the pipe symbol.
Note that contains
looks for an exact match of the search string and does not satisfy case insensitivity. To do so use test("akshay"; "i")
instead.
jqplay
link - https://jqplay.org/s/JzzfzqYWXYN