我想从字符串中提取ip和端口。
字符串如下所示。
目标x.x: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如果我注释掉declare语句,我会得到一个"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"我在echo上将$vipip包装在qoutes中,它的工作方式与我想象的一样。UGh等待是对时间的一大浪费。
发布于 2017-08-22 00:50:29
你可以像下面这样直接设置FS从你的命令中提取Ip,不需要循环,awk也可以搜索字符串
your_command | awk -F'[ :]' '/destination/{gsub(/[^0-9.]/,"",$2); print $2}'说明
-F'[ :]' -设置字段分隔符
'/destination/ -在行/记录/行中搜索单词目的地
gsub(/[^0-9.]/,"",$2) -从第二个字段中删除除数字和点之外的任何内容(以便像e这样的随机字符将被删除)
print $2 -打印第二个字段
https://stackoverflow.com/questions/45802029
复制相似问题