2009-07-26 3 views
1

tracerouteコマンドから「ホップ数」の値を解析してbashスクリプトで出力しようとしています。tracerouteコマンドからデータを解析する

ヒント非常に新しいので、ありがとう。

私のスクリプトは、これまでのようになります。

#!/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 " 

答えて

1

tracerouteの出力での「ホップ」(stderrに、実際に)の唯一の発生がstderrの「ヘッダ」行で、上部に向かっている:

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

など - これを1行で取得したい場合は、望ましくないヒットのリスクを減らすために"hops max,"などをgrepすることができます(一部の中間ホストがちょうど "ホップ" 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のパイプラインミックスは、単純なケース(複雑なものもありますが、awkやperlはのほうが、 ;-)のほうが適切かもしれません。

+0

私はmaxhopsの変数を設定するのが好きです。あなたの権利は、スクリプトの最終出力を次のように画面に表示することです: "ホストwww.google.comは---ホップ離れています"。 ----は、tracerouteコマンドから解析されたホップ値です。ユーザーが入力したサイトによって異なる場合があります。私はtracerouteとそのデータだけから解析されたホップ数を取得しようとしています。あなたはどう思いますか? –

+0

wc -lを使用すると正確ではないことに注意してください。つまり、tracerouteが表示されることもあるでしょう* * *ホップとして数えたいですか? – ghostdog74

+0

"header"はstderrにありますので、wcはそれを数えません(/ dev/nullにリダイレクトされますが、それは問題ではなく、&1にファンネルされていなければカウントされません)。それを試して、@ ghostdog74:テール-1とカット、そしてwc -lは、正確に同じ数を与える! –

2

ホップ数、または「最大64ホップ」の値を探していますか? (もっと良い言葉の欠如のために)到達できませんそれらのホップではない

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

別の方法、:それは前者だ場合は、最初の列を印刷し、その後、出力の最後の行を取得するにはawktailを使用数えられました

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