Bash
在解析 DNS 時需要在 bash 腳本中將 IP 列印為列表
我正在為 terraform 外部數據提供程序編寫以下 bash 腳本
# !/bin/bash echo {\"ip\":\"`nslookup nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | awk '/^Address: / { print $0 }'`\"}
我得到的輸出為
ssh_ip_address = "10.20.207.250 10.20.223.249 10.20.191.249"
我想將此輸出分解為帶逗號的列表,因為我想將每個 IP 稱為不同的輸出,以便在 terraform 腳本中作為輸入呼叫。
如果有人可以提供幫助,那就太好了
我假設您希望 JSON 作為輸出,IP 地址作為頂級
ip
鍵的值。根據你最終想要的,你可以使用
nslookup nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | sed -n 's/^Address: //p' | jq -Rs '{ ip: ( rtrimstr("\n") | split("\n") ) }'
…它使用刪除IP地址
sed
,然後將它們讀入JSON列表中jq
。這會給你{ "ip": [ "10.20.223.249", "10.20.191.249", "10.20.207.250" ] }
或者用逗號加入這些 IP 地址,
nslookup nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | sed -n 's/^Address: //p' | jq -Rs '{ ip: ( rtrimstr("\n") | split("\n") | join(",") ) }'
…這會給你
{ "ip": "10.20.207.250,10.20.223.249,10.20.191.249" }
您可以將
nslookup
and替換sed
為生成一組 IP 地址行的任何命令或管道。例如,您可能希望使用 roaima 在其答案中顯示的單個命令:dig +short nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com
dig
在和的幫助下jo
:$ dig +short nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | jo -a | jo ip=:- {"ip":["10.20.223.249","10.20.207.250","10.20.191.249"]}
當我執行你的程式碼時,我沒有得到任何類似你的輸出,所以我重新開始了。這是一個使用
dig
代替的解決方案nslookup
(並分成兩行以獲得額外的可讀性)printf "ssh_ip_address = \"%s\"\n" \ "$(dig +short nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | xargs | tr ' ' ',')"
輸出
ssh_ip_address = "10.20.223.249,10.20.207.250,10.20.191.249"
剛剛發現您一直都需要 JSON,這裡有一個相同命令的修改版本,可以做到這一點
printf "{ \"ip\": \"%s\" }\n" \ "$(dig +short nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | xargs | tr ' ' ',')"
輸出
{ "ip": "10.20.207.250,10.20.191.249,10.20.223.249" }