2013-07-12 3 views
0

나는 파일의 응답 시간을 계산하고 싶습니다. 응답 시간은 소스 (A)에 의한 패킷 전송과 소스 (A)에 의한 목적지 (B)에서 수신 된 ack 사이의 시간입니다. awk를 사용하면 응답 시간을 추출 할 수 있습니다. 그러나, 나는 논리를 적용하는 방법에 약간 혼란스러워합니다. 추적 파일의 일부 아래 :awk로 파일에서 시간을 계산하십시오.

+ 0.1 6 0 tcp 40 ------- 1 6.0 2.0 0 0 
- 0.1 6 0 tcp 40 ------- 1 6.0 2.0 0 0 
+ 0.101172 6 0 tcp 40 ------- 1 6.1 2.1 0 1 
- 0.102032 0 1 tcp 40 ------- 1 6.0 2.0 0 0 
+ 0.102394 6 0 tcp 40 ------- 1 6.2 2.2 0 2 
....... 
    ..... 
+ 0.112517 6 0 tcp 40 ------- 1 6.6 2.6 0 6 
+ 0.122096 1 2 tcp 40 ------- 1 6.0 2.0 0 0 
..... 
r 0.148256 0 6 ack 40 ------- 1 2.0 6.0 0 7 
r 0.149428 0 6 ack 40 ------- 1 2.1 6.1 0 8 
... 

이 예에서 나는 소스 (6)과 대상 (2) 사이의 통신에 초점을 맞출 것이다. 따라서 응답 시간은 (0.148256 - 0.1)입니다.

r 0.148256 0 6 ack 40 ------- 1 2.0 6.0 0 7 

이 줄 소스 6 포트 2 포트 0 ($ 9)로부터 ACK 인 응답은 0 ($ 10), 수신되는 것을 나타내지 만 예에서 첫 번째 행 :

+ 0.1 6 0 tcp 40 ------- 1 6.0 2.0 0 0  

소스 (6) 포트 0 ($ 9)에서 목적지 (2) 포트 0 ($ 10)으로 요청이 표시됩니다. 전체 추적 파일의 대상은 항상 (2)이며, 다음과 같이 생각합니다. 참고 : 포트 번호 ($ 9 또는 $ 10의 일부)가 변경 될 때마다 이는 새 요청 연결을 의미합니다.

은 시작 요청의 시간을 기록합니다 :

$1 == "+" && $5 == "tcp" && $6 == 40 && $10== 2.port && $9==source.port) { 
print $2; // would be the start 
} 

응답을 수신 시간을 기록하기를,

1) 흐름 아이디, 즉 흐름 (1)에 따라 :

$1 == "r" && $5 == "ack" && $6 == 40 && $9== 2.port && $10==source.port) { 
print $2; // would be the end 
} 

예상 출력은 하나 개의 컬럼으로 두 가지 방법이 될 수

source: 6.0 - 2.0 ---> response time: 0.148256 - 0.1 
    source: 6.1 - 2.1 ---> response time : end-start 
    source: any source.port-2.port --> response time : end-start 

내 문제는 내가 방법을 잘 모르겠어요 코드를 자동화하여 전체 추적 파일을 검토하고 응답 시간 값을 저장할 수 있습니다. 결국 그래프 응답 시간을 원합니다. 어떤 제안? 다른 스크립팅 언어에 신경 쓰지 마라!

+0

"위의 샘플 입력을 기반으로하는 필수 출력"섹션을 추가하고 명시 적으로 레이블을 지정하여 좋은 질문을 만들 수 있습니다. '# skip'과 같이 후행 주석을 사용하여 건너 뛸 것으로 예상되는 입력 행에 태그를 추가 할 수도 있습니다. 행운을 빕니다! – shellter

+0

힌트를 보내 주셔서 감사합니다. 업데이트를 확인하십시오! – SimpleNEasy

+0

죄송합니다. 샘플 출력으로 얻지는 못합니다. 이러한 리터럴 문자열을 원하면'print "응답 시간을 \ n ------------------- \ n 값"'으로 지정하십시오. 행운을 빕니다. – shellter

답변

1

오케이 - 필자는 파일의 매핑을 이해하지 못하지만이 예제를 기반으로하면 효과가있는 해결책을 제시 할 수 있습니다.

#!/bin/sh 

awk ' 

$1 == "+" && $5 == "tcp" { garr[ makeKey($4, $6, $10) ] = $2 } 

$1 == "r" && $5 == "ack" { 
    key = makeKey($3, $6, $9) 
    if(key in garr) 
     garr[ key ] = sprintf("d%f", ($2+0.0) - (garr[ key ]+0.0)) 
    } 

END { 
    for(key in garr) 
     printf("key = %s, value = %s\n", key, garr[ key ]) 
    } 

    function makeKey(arg1, arg2, arg3) { 
     return sprintf("%s:%s:%s", arg1, arg2, arg3) 
    } 

' $1 

전역 배열 garr에 대한 키를 생성하는 함수는 makeKey()입니다. 시작 행이있을 때마다 값을 입력하십시오. 마지막 행이 있으면 차이를 계산하십시오. 차이점은 동일한 키 위치에 저장되지만 그 앞에 "d"가 저장됩니다. 이런 종류의 기술은 표면 상으로는 끝점의 차이 만 인쇄하는 데 사용할 수 있습니다.

입력 파일에서 "...."행을 제거하고 (awk로 무시하는 대신) "data"라는 파일에 넣습니다.

"elap"및 "chmod + x elap"파일에 코드를 삽입하여 실행 가능하게 만들었습니다. 다음은이를 실행하는 예입니다.

prompt> elap data 
key = 2:40:2.0, value = 0.122096 
key = 1:40:2.0, value = 0.102032 
key = 2:40:2.1, value = 0.123268 
key = 0:40:2.0, value = d0.048256 
key = 0:40:2.1, value = 0.101172 
key = 1:40:2.5, value = 0.112802 
key = 0:40:2.2, value = 0.102394 
key = 1:40:2.6, value = 0.114549 
key = 0:40:2.6, value = 0.112517 

최종 출력은 원하는 형식과 일치하도록 변경 될 수 있습니다. 발견 된 유일한 차이점은 출력의 4 번째 줄에 있으며 "value = d0.048256"입니다.이 값은 예제 예제에서 와야합니다.

작성된 동일한 소스와 대상 사이의 여러 경과 시간을 추적하기 위해 키가 복잡하지 않을 수도 있습니다. 질문이 변경 후


, 나는 대답을 변경하지만 두 번째 스크립트가 수행되지 않은 차이를 생성하는 방법을 보여줍니다 때문에, 원본을 떠났다. 여기에 적절한 에티켓에 대해 확실하지 않습니다.

이것은 다음 "elap2"요청 된 출력을 생성

#!/bin/sh 

awk ' 

BEGIN { DELIM = " - " } 

    # grab "start" rows, ignore them if they are already in garr 
$1 == "+" && $5 == "tcp" && $6 == 40 { 
    key = makeKey($9, $10) 
    if(!(key in garr)) 
     garr[ key ] = $2 
    } 

$1 == "r" && $5 == "ack" && $6 == 40 { 
    key = makeKey($10, $9) 
    if(key in garr) 
     garr[ key ] = sprintf("%s%s%s", $2, DELIM, garr[ key ]) 
    } 

END { 
    for(key in garr) 
     { 
     value = garr[ key ] 
     # get the values back out here - only print entries with elapsed times 
     if(split(value, varr, DELIM) == 2) 
      printf("source: %s ---> response time: %s%s%s\n", key, 
       varr[1], DELIM, varr[2]) 
     } 
    } 

    function makeKey(source, destination) { 
     return sprintf("%s%s%s", source, DELIM, destination) 
    } 

' $1 

:

source: 6.0 - 2.0 ---> response time: 0.148256 - 0.1 
source: 6.1 - 2.1 ---> response time: 0.149428 - 0.101172 

정렬 통해 배관 후. 새로운 키를 기반으로 시작 행이 중복되어이 편집에서 표현한 것보다 문제가 더 복잡하다고 생각합니다. 각 키를 제공하는 고유 정보가 더 많으면 도움이됩니다.

+0

그건 내가 원한 것에 너무 가깝다. 그러나 코드를 실행할 때 두 가지 문제가있었습니다. 오류가 발생하고 코드가 계속 실행되고 결과가 출력됩니다. 2 행 : $ "r"명령을 찾을 수 없습니다. 이 오류는 문제가 아니며 해결할 수 있습니다. 그러나 출력을 이해해야합니다. 키 = 2 : 40 : 2.0, 값 = 0.122096, 키 값을 이해하지 못했습니다. 나는 key : source.port 2.port -> 응답 시간 = 차이를 가져야한다. 질문을 업데이트합니다. 고마워요. – SimpleNEasy

+0

고맙습니다. 각 라인 (즉, 소스 : 15.738 - 2.8024)마다 포트 번호가 달라지는 이유는 아직도 확실하지 않습니다. 그것은 동일해야합니다! – SimpleNEasy

+0

나는 그것이 당신을 위해 일해서 다행이다. 이전에 NS2 형식의 파일을 본 적이 없습니다. 소스 포트 번호가 원본 데이터 파일에 왜 정렬되지 않는지 추측 할 수 없습니다. 행운을 빕니다! – n0741337

관련 문제