我有一個這樣的檔案。 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可能有多個值,像這樣。 例2:
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和name servers是未知的,但可以通過awk regex進行排序。 我的目標是把服務器回傳的每一個IP放到一個字典里。
dictionary key 需要是回傳的 IP(如果是多個 IP,則是多個 IP)。 字典的值需要是回傳該答案的服務器。
一般來說,我想讓字典看起來像這樣:
例如,1:
例如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")/code>
例子3:
haproxy-3
google_b 127.0.0.1
google_b 127.0.0.2
haproxy-4
不能找不到后端
我現在的做法是,我分別獲得每個服務器的值,格式化它們以獲得回傳的ips和服務器,然后把它添加到字典中,像這樣:
haproxy-server是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到每個服務器都是分開的,導致代碼非常慢。
有什么方法可以解決這個問題嗎?
uj5u.com熱心網友回復:
$ eval declare -A haproxy_results=( $(
awk -v tgt='google_b' '
NF == 1 {
srvr = $0
}
(NF == 2) && (1 == tgt) {
srvrs[2] = (2美元在srvrs中 ? srvrs[2] OFS : "" ) srvr
}
END {
for (ip in srvrs) {
printf "%s["%s"]="%s"", sep, ip, srvrs[ip] 。
sep = OFS
}
列印 ""
}
'檔案
) )
$ declare -p haproxy_results
declare -A haproxy_results=([127.0.0.2]="haproxy-1 haproxy-2 haproxy-3"/span> [127.0.0.1]="haproxy-1 haproxy-2 haproxy-3"/span> )
警告:使用eval將把你的檔案內容暴露給shell解釋,因此輸入中的變數如$PWD和命令如$(ls)將被擴展,所以只有在你確定輸入中不能出現這樣的結構時才使用它。你可以采用更穩健但效率稍低的方法:
$ declare -A haproxy_results
while read -r ip srvrs; do
haproxy_results["$ip"/span>]="$srvrs"/span>
done < <(
awk -v tgt='google_b' '
NF == 1 {
srvr = $0
}
(NF == 2) && (1 == tgt) {
srvrs[2] = (2美元在srvrs中 ? srvrs[2] OFS : "" ) srvr
}
END {
for (ip in srvrs) {
print ip, srvrs[ip]
}
}
'檔案
)
$ declare -p haproxy_results
declare -A haproxy_results=([127.0.0.2]="haproxy-1 haproxy-2 haproxy-3"/span> [127.0.0.1]="haproxy-1 haproxy-2 haproxy-3"/span> )
上面的假設是,在你的真實資料中,你有不以google_b開頭的輸入的IP地址,你想忽略這些。如果不是這樣,那么就去掉-v tgt='google_b'和&& ($1 == tgt)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/308098.html
標籤:
