通过 bash 过滤 json - 不区分大小写 [英] filter json via bash - case insensitive

查看:24
本文介绍了通过 bash 过滤 json - 不区分大小写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 json 代码,需要通过 DNSName 属性的值对其进行过滤.过滤器必须不区分大小写.

I have json code and need to filter it by the value of the attribute DNSName. The filter must be case insensitive.

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

How can I do that? Is there a possibility to solve it with jq?

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

This is how I create the json code:

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

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

My unfiltered source json code looks like this:

{
    "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-2.elb.amazonaws.com,并且需要整个LoadBalancer 对象因此返回.这就是我希望我的结果的样子:

I now want some bash code to filter this result for the record with the DNSName property value MY-LB2-9876556789.us-west-2.elb.amazonaws.com, and need the entire LoadBalancer object back as a result. This is how I wish my result to look like:

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

有人知道怎么做吗?

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

Update: This solution works, but is not case insensitive:

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

<小时>

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


Update: This solution seems to work even better:

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

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

But I did not have the chance to test in detail yet.

推荐答案

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

You probably should be using test/2 rather than match/2, but in either case, since the problem description calls for case-insensitive equality, you would use an anchored regex:

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

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

With the caveat that ascii_upcase only translates ASCII characters, it might be more efficient to use it:

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

这篇关于通过 bash 过滤 json - 不区分大小写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆