通过 bash 过滤 json - 不区分大小写

filter json via bash - case insensitive

我有 json 代码,需要按 DNSName 属性的值过滤它。过滤器必须不区分大小写。

我该怎么做?有没有可能用jq解决呢?

这就是我创建 json 代码的方式:

aws elbv2 describe-load-balancers --region=us-west-2 | jq

我未过滤的源 json 代码如下所示:

{
    "LoadBalancers": [
        {
            "IpAddressType": "ipv4", 
            "VpcId": "vpc-abcdabcd", 
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:000000000000:loadbalancer/app/MY-LB1/a00000000000000a", 
            "State": {
                "Code": "active"
            }, 
            "DNSName": "MY-LB1-123454321.us-west-2.elb.amazonaws.com", 
            "SecurityGroups": [
                "sg-00100100", 
                "sg-01001000", 
                "sg-10010001"
            ], 
            "LoadBalancerName": "MY-LB1", 
            "CreatedTime": "2018-01-01T00:00:00.000Z", 
            "Scheme": "internet-facing", 
            "Type": "application", 
            "CanonicalHostedZoneId": "ZZZZZZZZZZZZZ", 
            "AvailabilityZones": [
                {
                    "SubnetId": "subnet-17171717", 
                    "ZoneName": "us-west-2a"
                }, 
                {
                    "SubnetId": "subnet-27272727", 
                    "ZoneName": "us-west-2c"
                }, 
                {
                    "SubnetId": "subnet-37373737", 
                    "ZoneName": "us-west-2b"
                }
            ]
        }, 
        {
            "IpAddressType": "ipv4", 
            "VpcId": "vpc-abcdabcd", 
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:000000000000:loadbalancer/app/MY-LB2/b00000000000000b", 
            "State": {
                "Code": "active"
            }, 
            "DNSName": "MY-LB2-9876556789.us-west-2.elb.amazonaws.com", 
            "SecurityGroups": [
                "sg-88818881"
            ], 
            "LoadBalancerName": "MY-LB2", 
            "CreatedTime": "2018-01-01T00:00:00.000Z", 
            "Scheme": "internet-facing", 
            "Type": "application", 
            "CanonicalHostedZoneId": "ZZZZZZZZZZZZZ", 
            "AvailabilityZones": [
                {
                    "SubnetId": "subnet-54545454", 
                    "ZoneName": "us-west-2a"
                }, 
                {
                    "SubnetId": "subnet-64646464", 
                    "ZoneName": "us-west-2c"
                }, 
                {
                    "SubnetId": "subnet-74747474", 
                    "ZoneName": "us-west-2b"
                }
            ]
        }
    ]
}

我现在想要一些 bash 代码来过滤 DNSName 属性 值 MY-LB2-9876556789.us-west-[= 记录的结果44=],因此需要返回整个 LoadBalancer 对象。这就是我希望结果的样子:

{
    "IpAddressType": "ipv4", 
    "VpcId": "vpc-abcdabcd", 
    "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:000000000000:loadbalancer/app/MY-LB2/b00000000000000b", 
    "State": {
        "Code": "active"
    }, 
    "DNSName": "MY-LB2-9876556789.us-west-2.elb.amazonaws.com", 
    "SecurityGroups": [
        "sg-88818881"
    ], 
    "LoadBalancerName": "MY-LB2", 
    "CreatedTime": "2018-01-01T00:00:00.000Z", 
    "Scheme": "internet-facing", 
    "Type": "application", 
    "CanonicalHostedZoneId": "ZZZZZZZZZZZZZ", 
    "AvailabilityZones": [
        {
            "SubnetId": "subnet-54545454", 
            "ZoneName": "us-west-2a"
        }, 
        {
            "SubnetId": "subnet-64646464", 
            "ZoneName": "us-west-2c"
        }, 
        {
            "SubnetId": "subnet-74747474", 
            "ZoneName": "us-west-2b"
        }
    ]
}

有人知道怎么做吗?


更新: 此解决方案有效,但不区分大小写:

aws elbv2 describe-load-balancers --region=us-west-2 | jq -c '.LoadBalancers[] | select(.DNSName | contains("MY-LB2"))'

更新: 这个解决方案似乎效果更好:

aws elbv2 describe-load-balancers --region=us-west-2 | jq -c '.LoadBalancers[] | select(.DNSName | match("my-lb2";"i"))'

但我还没有机会详细测试。

您可能应该使用 test/2 而不是 match/2,但无论哪种情况,因为问题描述要求 不区分大小写的相等性,您将使用锚定的正则表达式:

.LoadBalancers[]
| select(.DNSName | test("^my-lb2-9876556789.us-west-2.elb.amazonaws.com$";"i"))

注意 ascii_upcase 只翻译 ASCII 字符,使用它可能更有效:

 .LoadBalancers[]
 | select(.DNSName | ascii_upcase == "MY-LB2-9876556789.US-WEST-2.ELB.AMAZONAWS.COM")