bash - 通过 bash 过滤 json - 不区分大小写
问题描述
我有 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-2.elb.amazonaws.com的记录,并因此需要返回整个 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 字符的警告,ascii_upcase
使用它可能更有效:
.LoadBalancers[]
| select(.DNSName | ascii_upcase == "MY-LB2-9876556789.US-WEST-2.ELB.AMAZONAWS.COM")
推荐阅读
- php - 以形式调用 php 函数 - wordpress
- java - 使用 slf4j、log4j 和 java.util.logging 混合 java 日志记录
- android - 如何使用 Retrofit 从 JsonArray 获取单个对象?
- java - 我的代码输出有点麻烦
- bash - 需要对 Apache 日志文件中的 ips 进行排序
- c++ - SFML Audio 使用 sf::Music 实时获取样本
- python-2.7 - foobar 挑战卡在质数位置
- python - Flask + Zappa 的 iOS 400 错误请求
- docker - 如何使 ffmpeg 在我的 Docker 容器中可用?
- macos - macOS 屏幕保护程序性能问题