将 traceroute IP 与数组值进行比较
Compare traceroute IP with array values
我正在尝试比较 traceroute 在 bash 中是否成功。这就是我执行的。
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(数组的第一个值)与数组的最后 3 个值进行比较,但是当我尝试比较时,出现浮点数比较错误。
编辑:
我试过这段代码,但它给我错误的浮点数比较。
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" 来解决浮动比较问题,但是除了将其存储在数组中之外,还有其他方法可以解决这个内联问题吗?
I want to compare 8.8.8.8 (first value of the array) with last 3 values of the array
只需获取输出中的第一个值,然后用最后 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
中的 值 。如果你想要数组的 indexes,你需要用 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"(不知道它是如何调用的)是 =
而不是 ==
.
您可以使用此 awk
满足您的要求:
traceroute -m 30 -n 8.8.8.8 |&
awk '=="traceroute"{ip=} /ms$/{a[++n] = (+0 == ? : )}
END{for (i=n-2; i<=n; i++) if (ip == a[i]) exit 1}'
当最后 3 行中的任何 IP 地址与以 traceroute
开头的第一行中的 IP 地址匹配时,它将以状态 1
退出。如果没有匹配项,则退出状态将为 0
.
我正在尝试比较 traceroute 在 bash 中是否成功。这就是我执行的。
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(数组的第一个值)与数组的最后 3 个值进行比较,但是当我尝试比较时,出现浮点数比较错误。
编辑:
我试过这段代码,但它给我错误的浮点数比较。
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" 来解决浮动比较问题,但是除了将其存储在数组中之外,还有其他方法可以解决这个内联问题吗?
I want to compare 8.8.8.8 (first value of the array) with last 3 values of the array
只需获取输出中的第一个值,然后用最后 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
中的 值 。如果你想要数组的 indexes,你需要用 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"(不知道它是如何调用的)是 =
而不是 ==
.
您可以使用此 awk
满足您的要求:
traceroute -m 30 -n 8.8.8.8 |&
awk '=="traceroute"{ip=} /ms$/{a[++n] = (+0 == ? : )}
END{for (i=n-2; i<=n; i++) if (ip == a[i]) exit 1}'
当最后 3 行中的任何 IP 地址与以 traceroute
开头的第一行中的 IP 地址匹配时,它将以状态 1
退出。如果没有匹配项,则退出状态将为 0
.