解析ns2跟踪文件
我使用NS 2.35并试图确定我的路由算法的端到端延迟。解析ns2跟踪文件
我认为任何有良好脚本经验的人都应该能够回答这个问题,可悲的是,那个人不是我。
我有一个跟踪文件,看起来像这样:
- -t 0.548 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1052 -a 0 -x {2.0 17.0 6 ------- null}
h -t 0.548 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1052 -a 0 -x {2.0 17.0 -1 ------- null}
+ -t 0.55 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1056 -a 0 -x {2.0 17.0 10 ------- null}
+ -t 0.555 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1057 -a 0 -x {2.0 17.0 11 ------- null}
r -t 0.556 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1047 -a 0 -x {2.0 17.0 1 ------- null}
+ -t 0.556 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1047 -a 0 -x {2.0 17.0 1 ------- null}
- -t 0.556 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1047 -a 0 -x {2.0 17.0 1 ------- null}
但这里是我需要做的。
一条以+
开头的行是当一个新数据包被添加到网络时。 以r
开头的行是目的地收到数据包的时候。 -t之后的双重数字是事件发生的时间。最后,-i是数据包的标识。
对于我来计算平均端到端延迟,我需要在-i之后找到每个具有特定id的行。从那里我需要计算r
的时间戳减去+
的时间戳
所以我认为可能有一个正则表达式由空格分隔。我可以将每个分段放入自己的变量中。然后我会检查15号(包ID)。
但我不知道该从哪里走,或如何把它放在一起。
我知道网上有一些AWK脚本可以做到这一点,但它们都过时了,并且不符合当前格式(我不知道如何更改它们)。
任何帮助将不胜感激。
编辑:
这里就是我希望找到一个完整的数据包路由的实例。 我已经在这些之间取出了很多行,以便您可以看到单个数据包事件。
# a packet is enqueued from node 2 going to node 7. It's ID is 1636. this was at roughly 1.75sec
+ -t 1.74499999999998 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
# at 2.1s, it left node 2.
- -t 2.134 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
# at 2.134 it hopped from 2 to 7 (not important)
h -t 2.134 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 -1 ------- null}
# at 2.182 it was received by node 7
r -t 2.182 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
# it was the enqueued by node 7 to be sent to node 12
+ -t 2.182 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
# slightly later it left node 7 on its was to node 12
- -t 2.1832 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
# it hopped from 7 to 12 (not important)
h -t 2.1832 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 -1 ------- null}
# received by 12
r -t 2.2312 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
# added to queue, heading to node 17
+ -t 2.2312 -s 12 -d 17 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
# left for node 17
- -t 2.232 -s 12 -d 17 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
# hopped to 17 (not important)
h -t 2.232 -s 12 -d 17 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 -1 ------- null}
# received by 17 notice the time delay
r -t 2.28 -s 12 -d 17 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null}
脚本将承认2.134为开始时间,并为2.28结束,然后给我的0.146sec延迟的理想输出。它会为所有数据包ID执行此操作,并只报告平均值。
有人要求我扩展一下文件的工作方式,以及我的期望。
该文件列出了约10,000个数据包的说明。每个数据包可以处于不同的状态。重要的状态是+
,这意味着一个数据包已经在一个路由器入队,而r
这意味着数据包已经被它的目的地接收。
有可能一个被入队的数据包(因此+
入口)没有被实际接收,而是被丢弃。这意味着我们不能假定每个+
条目都会有一个r
条目。
我试图衡量的是平均端到端延迟。这意味着,如果你看一个单一的数据包,就会有一段时间它被排队,并且它会被接收。我需要做这个计算来找到它的端到端延迟。但我还需要为9,999个其他数据包来获得平均值。
我已经考虑过更多,并且总体来说我认为算法需要工作。
- 删除不与
+
或r
开始,因为它们是不重要的所有行。 - 检查所有数据包ID(即-i后面的数字,例如1052),并将它们放入某种组(也许是多个数组)。
- 每个组现在应该包含有关特定数据包的所有信息。
- 组内,检查是否有+,理想情况下我们想要第一个+。记录下它的时间。
- 寻找更多
+
行。看看他们的时间。日志可能有点混乱。所以它可能会有一个+
线,事实上在模拟的早些时候。 - 如果这个新的
+
行有一个更早的时间,然后用它更新时间变量。 - 假设没有更多
+
行,请查找r
行。 - 如果没有
r
行,数据包就被丢弃,所以不用担心。 - ,每
r
线你会发现,我们需要做的是找到谁拥有最新的时间戳 - 与最新的时间戳
r
线是在数据包终于收到了一个。 - 从
r
时间中减去+
时间,这给了我们分组传送所花费的时间。 - 将此值添加到数组中,以便稍后对其进行平均。
- 在每个数据包ID组上重复这个过程,然后最终平均所创建的延迟数组。
这就是很多打字,但我认为它的清晰,因为我可以在我想要的。我希望我是一个正则表达式大师,但我没有足够的时间去学习它来完成这个任务。
感谢您的帮助,如果您有任何问题,请告诉我。
没有太多在这里工作,因为伊恩在评论你的问题说,但如果我理解你想要正确地做什么,这样的事情应该工作:
awk '/^[+r]/{$1~/r/?r[$15]=$2:r[$15]?d[$15]=r[$15]-$2:1} END {for(p in d){sum+=r[p];num++}print sum/num}' trace.file
它跳过所有行不以'+'或'r'开头。如果该行以'r'开始,则会向r数组添加时间。否则,它计算延迟并将其添加到d数组,如果在r数组中找到该元素。最后,它遍历d数组中的元素,将总延迟和元素数加起来,并从中计算平均值。在你的情况下,平均值为0.
:1
在主块的末尾就在那里,所以我可以用三元表达式来代替明显更冗长的if语句。
编辑:新的表达与添加的条件下工作:
awk '/^[+r]/{$1~/r/?$3>r[$15]?r[$15]=$3:1:!a[$15]||$3<a[$15]?a[$15]=$3:1} END {for(i in r){sum+=r[i]-a[i];num++}print "Average delay", sum/num}'
或作为一个awk文件
/^[+r]/ {
if ($1 ~ /r/) {
if ($3 > received[$15])
received[$15] = $3;
} else {
if (!added[$15] || $3 < added[$15])
added[$15] = $3;
}
} END {
for (packet in received) {
sum += received[packet] - added[packet];
num++
}
print "Average delay", sum/num
}
根据你的算法好像1.745将是开始时间,而你写的是2.134。
如果你不介意,你能展示你的最终结果应该是什么样子?这有点难以理解。例如 –
以'-'和'h'开头的行是什么? –
1)当你运行这个,它会是一个特定的身份,还是你想做这个匹配的文件中的所有身份? 2)您在工作文件中预计多大/多少行?我们在谈论多MB文件吗? –