从traceroute命令解析数据

时间:2009-07-26 03:04:00

标签: bash shell traceroute

我试图从traceroute命令解析“跳数”值,并用bash脚本输出。

任何提示?很新,所以谢谢。

到目前为止,我的脚本看起来像这样:

#!/bin/bash
#parse traceroute for hops and output to stdout.
echo -n "Enter a host name(like www.google.com):  "
read hostname
traceroute 2>&1 $hostname|grep "hops"
echo "number of hops are "

4 个答案:

答案 0 :(得分:2)

您是在寻找它所花费的跳数,还是“最大64跳”值?如果是前者,请使用tail获取最后一行输出,然后使用awk打印第一列:

traceroute "$hostname" 2>/dev/null | tail -1 | awk '{print $1}'

答案 1 :(得分:1)

traceroute输出中唯一出现的“跳跃”(实际上是stderr)位于stderr“header”行的顶部:

traceroute to foo.bar.com (123.12.1.23), 30 hops max, 40 byte packets

之类的 - 如果那是你要抓住的那一行,你可能会为"hops max,"或类似的东西寻找,以减少不受欢迎的命中的风险(如果某些中间主机碰巧有“跳” “在他们的DNS中。”

这是什么意思?你的问题是抓住这个30,最大跳数,变成bash变量吗?如果是这样,那么

maxhops=`traceroute www.yahoo.com 2>&1 >/dev/null | grep "hops max" | cut -d' ' -f5`

应该有帮助 - 您可以在此之后使用$maxhops(在上面的例子中它将是30)。

但我怀疑你的意思完全不同 - 澄清,也许......?

编辑:OP已经澄清了他们想要的,而不是maxhops,而是由traceroute测量的实际跳数;为此目的,

numhops=`traceroute www.yahoo.com 2>/dev/null | tail -1 | cut -d' ' -f2`

或更简单的

numhops=`traceroute www.yahoo.com | wc -l`

应该可以正常使用!

如果你想要任何更高级的东西(或多个结果等),那么其他答案中建议的awk非常好,但是grep,tail和cut的管道混合,是一种传统的unix-y方法,对于简单的情况(以及一些复杂的情况,但是awk或perl可能更适合那些; - )仍然可行。

答案 2 :(得分:0)

traceroute www.google.com 2>/dev/null | awk 'NR==1{print $5;exit}'

答案 3 :(得分:0)

另一种方式,那些不可达的啤酒花(缺少更好的单词)不计算

# traceroute www.yahoo.com 2>/dev/null | awk 'NR>1 && !/* * */{c++}END{print c}'
  16