2013-07-12 37 views
0

我想从我拥有的文件计算响应时间。响应时间将是从源(A)发送数据包到源(A)从目的地(B)收到确认之间的时间。使用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 

这行示出了0($ 10)中接收它是从2端口0($ 9)ACK至 源6端口的答复,虽然在示例中,第一行:

+ 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 == "r" && $5 == "ack" && $6 == 40 && $9== 2.port && $10==source.port) { 
print $2; // would be the end 
} 

预期的输出可以通过两种方式为一列:基于流ID IE流1

1):

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

对不起,我真的不把它作为示例输出。如果你想要这些文字字符串,只需'打印'响应时间\ 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 

有一个makeKey()函数可以为全局数组garr生成键。每当有起始行时,输入一个值。当有最后一行时,尝试计算差异。然后将差异存储在同一个关键位置,但前面有一个“d”。这种技术可能表面上仅用于打印END中的差异。

我从输入文件中删除了“....”行(而不是用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 

最终的输出可以改变,以匹配你想要的格式。唯一的区别是在输出的第四行,并有“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”命令未找到。这个错误不是问题,我可以修复它。但是,我需要了解输出:key = 2:40:2.0,value = 0.122096,我不明白关键值。我需要密钥:source.port 2.port - > response time = difference。将更新问题。非常感谢 – SimpleNEasy

+0

谢谢你的工作。我仍然不确定为什么我会为每条线获得不同的端口号,例如来源:15.738 - 2.8024。它应该是一样的! – SimpleNEasy

+0

我很高兴它适合你。我从来没有见过NS2格式的文件。我无法推测为什么源端口号不在原始数据文件中排列。祝你好运! – n0741337