1

我正在尝试从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

4 回答 4

2

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

traceroute "$hostname" 2>/dev/null | tail -1 | awk '{print $1}'
于 2009-07-26T03:15:30.243 回答
1

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

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

或类似的——如果这是你想要抓住的一条线,你可能会 grep for"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 可能更适合那些;-)。

于 2009-07-26T03:13:17.190 回答
0
traceroute www.google.com 2>/dev/null | awk 'NR==1{print $5;exit}'
于 2009-07-26T04:57:05.030 回答
0

另一种方式,不计算那些无法到达的跃点(因为缺少更好的词)

# traceroute www.yahoo.com 2>/dev/null | awk 'NR>1 && !/* * */{c++}END{print c}'
  16
于 2009-07-27T02:06:14.753 回答