比较traceroute IP与数组值

时间:2018-06-28 10:06:58

标签: arrays bash grep traceroute

我正在尝试比较traceroute是否成功。这就是我执行的。

traceroute -m 30 -n 8.8.8.8 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'

我收到的输出:

  

8.8.8.8

     

8.8.8.8

     

192.192.192.21

     

192.191.191.32

     

192.18.128.48

     

8.8.8.8

     

192.168.168.168

我想将8.8.8.8(数组的第一个值)与数组的后三个值进行比较,但是当我尝试它时,出现浮点比较的错误。

编辑:

我尝试了这段代码,但是它给我浮点数比较带来了错误。

for i in ${my_array[@]};
do
        if [ "${my_array[0]}" == "${my_array[i+1]}" ]; then
                echo "values are same";
        else
                echo "values are not same";
        fi
        echo $i;    
done

我知道可以使用“ bc”解决浮点比较问题,但是还有其他方法可以解决此内联而不是将其存储在数组中吗?

2 个答案:

答案 0 :(得分:2)

  

我想将8.8.8.8(数组的第一个值)与数组的后3个值进行比较

只需获取输出中的第一个值,并用最后三行对其进行grep:

output="8.8.8.8

8.8.8.8

192.192.192.21

192.191.191.32

192.18.128.48

8.8.8.8

192.168.168.168"

output=$(sed '/^$/d' <<<"$output") # remove empty lines

if grep -q "$(head -n1 <<<"$output")" <(tail -n3 <<<"$output"); then
        echo "Last three lines of output contain first line of the output"
else
        echo "fus ro dah"
fi

现在输入您的代码:

for i in ${my_array[@]};

遍历my_array中的。如果要索引为数组,则需要使用for ((i = 0; i < ${#my_array[@]}; ++i))对其进行迭代。现在我猜出来了:

for ((i = ${#my_array[@]} - 3; i < ${#my_array[@]}; ++i)); do
        if [ "${my_array[0]}" = "${my_array[i]}" ]; then
                echo "values are same";
        else
                echo "values are not same";
        fi
        echo $i;    
done

可能会做您想要的,但是使用grep:

if grep -q "${my_array[0]}" <(printf "%s\n" "${my_array[@]: -3}"); then
    echo "values are same"
else
    echo "values are not same"
fi

对我来说仍然更简单。
还要注意,test中的字符串比较“ operator”(不叫它)是=而不是==

答案 1 :(得分:2)

您可以根据需要使用此awk

traceroute -m 30 -n 8.8.8.8 |&
awk '$1=="traceroute"{ip=$3} /ms$/{a[++n] = ($1+0 == $1 ? $2 : $1)}
     END{for (i=n-2; i<=n; i++) if (ip == a[i]) exit 1}'

当最后3行中的任何IP地址与以1开头的第一行IP匹配时,它将以状态traceroute退出。如果没有匹配项,则退出状态将为0