2009-07-26 17 views
1

Ich versuche, den Wert "Anzahl der Hops" aus dem traceroute Befehl zu analysieren und es mit einem Bash-Skript ausgeben.Parsing Daten von traceroute Befehl

Irgendwelche Hinweise? Sehr neu, danke.

Mein Skript sieht wie folgt aus so weit:

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

Antwort

1

Das einzige Vorkommen von "Sprüngen" in trace Ausgang (stderr, tatsächlich) ist nach oben hin in der stderr "header" Zeile:

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

oder Ähnliches - wenn das die eine Zeile ist, die Sie greifen möchten, könnten Sie nach "hops max," oder ähnlichem suchen, um das Risiko von unerwünschten Treffern zu reduzieren (sollte ein Zwischen-Host gerade "Hops" in seinem haben) DNS).

Ist das was du meinst? Ist Ihr Problem das Ergreifen dieser 30, die maximale Anzahl von Hops, in eine Bash-Variable? Wenn das so ist, dann

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

sollte helfen - Sie $maxhops danach verwenden können (und es wird 30 in dem obigen Beispiel sein).

Aber ich vermute, du meinst etwas völlig anderes - klar, vielleicht ...?

Bearbeiten: das OP hat geklärt, sie wollen, nicht maxhops, aber die tatsächliche Anzahl der Hopfen wie von Traceroute gemessen; zu diesem Zweck

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

oder ein einfacheres

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

sollte gut funktionieren!

Wenn Sie etwas schicker (oder mehr als ein Ergebnis, usw.) wollen, dann awk wie in anderen Antworten vorgeschlagen, ist völlig in Ordnung, aber eine Pipeline-Mix von Grep, Tail und Cut, ist eine ziemlich traditionelle Unix-y-Ansatz , und immer noch recht gut für einfache Fälle (und einige komplexe, aber awk oder perl ist vielleicht besser geeignet für diese ;-).

+0

ich mag die Idee, eine Variable von maxhops zu setzen. Ihr Recht, ich wollte die endgültige Ausgabe des Skripts auf dem Bildschirm angezeigt werden: "Der Host www.google.com ist --- hüpft weg". Der ---- wäre der Hop-Wert, der vom Befehl traceroute analysiert wird. Je nach der vom Benutzer eingegebenen Site kann dies unterschiedlich sein. also versuche ich nur die Anzahl der Hops zu erfassen, die von Traceroute und nur diesen Daten analysiert wurden. was denkst du? –

+0

Beachten Sie, dass die Verwendung von wc -l nicht korrekt ist, da der Header nicht gezählt werden sollte.Das heißt, manchmal wird Traceroute zeigen * * * Willst du das als einen Sprung zählen? – ghostdog74

+0

Der "Header" ist auf stderr, also wc wird es nicht zählen (es ist umgeleitet zu/dev/null, aber das ist nicht das Problem, es würde sowieso nicht gezählt werden, es sei denn, Trichter & 1). Probieren Sie es aus, @ ghostdog74: der Schwanz -1 und Schnitt, und der WC-l, geben genau die gleiche Anzahl! –

2

Suchen Sie nach der Anzahl der Hops, die es dauerte, oder nach dem "64 hops max" -Wert? Wenn es die ehemalige ist, verwenden Sie tail die letzte Zeile der Ausgabe zu erhalten, dann awk die erste Spalte zu drucken:

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

eine andere Art und Weise, in der dieser Hopfen nicht erreichbar (mangels besserem Wort) nicht gezählt

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