我想从字符串中提取 ip 和端口。
字符串看起来像这样。
目的地 xxxx:yyyy
其中 x 是 ip,y 是端口
commandout=()
while IFS= read -r line # Read a line
do
commandout+=("$line") # Append line to the array
done < <(tmsh list ltm virtual $vip | grep destination)
for output in "$commandout";
do
if [[ $output == *"destination"* ]];then
#split off ip and port
ipport=$(echo $output | awk 'BEGIN{}{print $2}')
echo $ipport | awk 'BEGIN{FS=":"}{print $1}'
echo $ipport
fi
done
declare -p commandout
出于某种原因,awk 在 IP 地址后打印了一个随机的“e”。但它似乎只在 2 之后这样做。
10.10.10.10
10.10.10.10:https
declare -a commandout='([0]=" destination 10.10.10.10:https")'
12.12.12.12e
12.12.12.12:https
declare -a commandout='([0]=" destination 12.12.12.12:https")'
更新:
所以我尝试了另一个测试。我发现了奇怪的行为,我不确定如何解决它。
我在设置之前和之后声明了vipip。
declare -p vipip
vipip=$(tmsh list ltm virtual $vip | grep destination | awk 'BEGIN{}{print $2}' | awk 'BEGIN{FS=":"}{print $1}')
echo $vipip
declare -p vipip
echo "cyle loop"
结果如下。请注意,12.12.12.12 的末尾没有“e”
./findvips-final.scr: line 240: declare: vipip: not found
10.10.10.10
declare -- vipip="10.10.10.10"
cyle loop
declare -- vipip="10.10.10.10"
12.12.12.12
declare -- vipip="12.12.12.12"
cyle loop
如果我注释掉声明语句,我会得到一个“e”
#declare -p vipip
vipip=$(tmsh list ltm virtual $vip | grep destination | awk 'BEGIN{}{print $2}' | awk 'BEGIN{FS=":"}{print $1}')
echo $vipip
#declare -p vipip
echo "cyle loop"
结果是
10.10.10.10
cyle loop
12.12.12.12e
cyle loop
我找到了答案。我在上面有一个进度表,我正在完成 e 。
echo -ne "$((100*$z/$count))% Complete\r"
我将 $vipip 包裹在 echo 的 qoutes 中,它的工作方式和我想的一样。哎呀等太浪费时间了。