首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤ip返回并将服务器命名为字典。bash

过滤ip返回并将服务器命名为字典。bash
EN

Stack Overflow用户
提问于 2021-09-13 14:16:04
回答 1查看 64关注 0票数 0

我有一个类似这样的文件: Example1:

代码语言:javascript
复制
haproxy-1
google_b 127.0.0.1
haproxy-2
google_b 127.0.0.1
haproxy-3
google_b 127.0.0.2

该文件可能具有ips的多个值,如: Example2:

代码语言:javascript
复制
haproxy-1
google_b 127.0.0.1
google_b 127.0.0.2
haproxy-2
google_b 127.0.0.1
google_b 127.0.0.2
haproxy-3
google_b 127.0.0.1
google_b 127.0.0.2

我唯一可以使用的变量是google_b变量。Ips和名称服务器是未知的,但可以通过awk regex进行排序。我的目标是将服务器返回的每个ip放到字典中。

字典键需要返回IP (如果多个ips,则多个ips)。字典值需要是返回该答案的服务器。

一般来说,我想要一本像这样的字典:

例如1:

haproxy_results=( ["127.0.0.1"]="haproxy-1 haproxy-2" ["127.0.0.2"]="haproxy-3")

例如2:

haproxy_results=( ["127.0.0.1"]="haproxy-1 haproxy-2 haproxy-3" ["127.0.0.2"]="haproxy-1 haproxy-2 haproxy-3")

例3:

代码语言:javascript
复制
haproxy-3
google_b 127.0.0.1
google_b 127.0.0.2
haproxy-4
Can't find backend

现在我是如何为每个服务器分别获取值,格式化它们以获得返回的ips和服务器,并将其添加到字典中,如下所示:

代理服务器是haproxy-1haproxy-2等.

haproxy_ip_returned是ips 127.0.0.1 127.0.0.2等.

haproxy_results+=([$haproxy_ip_returned]+=$haproxy-server)

这很糟糕,因为我使用ansible将数据和ssh分别发送到每个服务器,这会导致代码非常慢。

对怎么做有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-13 16:00:16

代码语言:javascript
复制
$ eval declare -A haproxy_results=( $(
    awk -v tgt='google_b' '
        NF == 1 {
            srvr = $0
        }
        (NF == 2) && ($1 == tgt) {
            srvrs[$2] = ($2 in srvrs ? srvrs[$2] OFS : "") srvr
        }
        END {
            for (ip in srvrs) {
                printf "%s[\"%s\"]=\"%s\"", sep, ip, srvrs[ip]
                sep = OFS
            }
            print ""
        }
    ' file
) )
代码语言:javascript
复制
$ declare -p haproxy_results
declare -A haproxy_results=([127.0.0.2]="haproxy-1 haproxy-2 haproxy-3" [127.0.0.1]="haproxy-1 haproxy-2 haproxy-3" )

警告:使用eval将向shell公开文件的内容以进行解释,因此将展开输入中的变量(如$PWD )和命令(如$(ls) ),因此只有当您确信输入中不能出现此类构造时才使用它。你可以做得更有力,但效率稍低:

代码语言:javascript
复制
$ declare -A haproxy_results

$ while read -r ip srvrs; do
    haproxy_results["$ip"]="$srvrs"
done < <(
    awk -v tgt='google_b' '
        NF == 1 {
            srvr = $0
        }
        (NF == 2) && ($1 == tgt) {
            srvrs[$2] = ($2 in srvrs ? srvrs[$2] OFS : "") srvr
        }
        END {
            for (ip in srvrs) {
                print ip, srvrs[ip]
            }
        }
    ' file
)
代码语言:javascript
复制
$ declare -p haproxy_results
declare -A haproxy_results=([127.0.0.2]="haproxy-1 haproxy-2 haproxy-3" [127.0.0.1]="haproxy-1 haproxy-2 haproxy-3" )

上述假设假设,在实际数据中,输入的IP地址不以google_b开头,您希望忽略这些地址。如果不是这样的话,那么就去掉-v tgt='google_b'&& ($1 == tgt)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69164259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档