2009-07-26 7 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 to foo.bar.com (123.12.1.23), 30 hops max, 40 byte packets 

등 - 원하던 한 줄이라면 바람직하지 않은 히트의 위험을 줄이기 위해 "hops max," 또는 그와 비슷한 grep을 사용할 수 있습니다 (일부 중간 호스트가 방금 "홉"을 가지면 DNS).

이게 무슨 뜻이야? 문제는 bash 변수로이 최대 30 개의 홉을 차지합니까? 이 후 $maxhops을 사용할 수 있습니다 (그리고 위의 예에서 30 예정) - 그 다음, 그래서 만약

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

는 도움이 될 것입니다.

하지만 완전히 다른 것을 의미하는 것으로 의심됩니다. 분명히 ... 어쩌면 ...?

편집 : OP는 traitsoute로 측정 한 실제 홉 수와 maxhops가 아닌 원하는 것으로 밝혀졌습니다. 그 목적,

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은 에 대해 더 적절할 수도 있습니다) ;-).

+0

나는 maxhops 변수를 설정한다는 생각을 좋아합니다. 귀하의 권리는 다음과 같이 스크립트의 최종 출력물을 화면에 표시합니다. "호스트 www.google.com은 --- 홉 거리입니다." ----는 traceroute 명령에서 파싱 된 홉 값입니다. 사용자가 입력 한 사이트에 따라 다를 수 있습니다. 그래서 나는 단지 traceroute에서 파싱 된 홉 수와 그 데이터 만 잡으려고한다. 어떻게 생각하니? –

+0

wc -l을 사용하면 헤더가 계산되지 않아야하므로 정확하지 않습니다.즉, traceroute에 몇 번이나 표시됩니다 * * * 당신은 그것을 홉으로 간주하고 싶습니까? – ghostdog74

+0

"헤더"가 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를 사용 counted

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