Bash

在解析 DNS 時需要在 bash 腳本中將 IP 列印為列表

  • May 30, 2022

我正在為 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"
}

您可以將nslookupand替換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" }

引用自:https://unix.stackexchange.com/questions/704364