1

我想从字符串中提取 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 中,它的工作方式和我想的一样。哎呀等太浪费时间了。

4

1 回答 1

0

您可以FS像下面这样直接设置从命令中提取 Ip,无需循环,awk也可以搜索字符串

your_command | awk -F'[ :]' '/destination/{gsub(/[^0-9.]/,"",$2); print $2}'

解释

-F'[ :]'- 设置字段分隔符

'/destination/- 在行/记录/行中搜索单词目的地

gsub(/[^0-9.]/,"",$2)- 从第二个字段中删除除数字和点以外的任何内容(以便随机字符e,如您上面所说的将被删除)

print $2- 打印第二个字段

于 2017-08-21T16:50:29.030 回答