我有一个类似这样的文件: Example1:
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:
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:
haproxy-3
google_b 127.0.0.1
google_b 127.0.0.2
haproxy-4
Can't find backend现在我是如何为每个服务器分别获取值,格式化它们以获得返回的ips和服务器,并将其添加到字典中,如下所示:
代理服务器是haproxy-1或haproxy-2等.
haproxy_ip_returned是ips 127.0.0.1 127.0.0.2等.
haproxy_results+=([$haproxy_ip_returned]+=$haproxy-server)
这很糟糕,因为我使用ansible将数据和ssh分别发送到每个服务器,这会导致代码非常慢。
对怎么做有什么想法吗?
发布于 2021-09-13 16:00:16
$ 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
) )$ 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) ),因此只有当您确信输入中不能出现此类构造时才使用它。你可以做得更有力,但效率稍低:
$ 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
)$ 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)。
https://stackoverflow.com/questions/69164259
复制相似问题