正则表达式 – 解析ns2跟踪文件
我正在使用NS 2.35并且我正在尝试确定路由算法的端到端延迟.
我认为任何具有良好脚本编写经验的人都应该能够回答这个问题,遗憾的是那个人不是我. 我有一个跟踪文件,看起来像这样: - -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} 但这是我需要做的. 以新数据包添加到网络的行开头. 为了计算平均端到端延迟,我需要找到-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.146秒的延迟.它会对所有数据包ID执行此操作,并仅报告平均值. 有人要求我扩展一下文件的工作方式,以及我期待的内容. 该文件列出了大约10,000个数据包的描述.每个数据包可以处于不同的状态.重要的状态意味着数据包已经在路由器中排队,而r意味着数据包已被其目的地接收. 排队的数据包(所以条目)可能实际上没有被接收而是被丢弃.这意味着我们不能假设每个条目都会有一个r条目. 我想要衡量的是平均端到端延迟.这意味着,如果你看一个数据包,它将有一个排队的时间,以及它收到的时间.我需要进行此计算以找到其端到端延迟.但我还需要为9,999个其他数据包执行此操作以获得平均值. 我已经考虑过了更多,并且通常我认为算法需要工作. >删除所有不以a或r开头的行,因为它们不重要. 这是很多打字,但我认为它可以像我想要的那样清晰.我希望我是一个正则表达式的主人,但我没有时间去学习它,以便将其拉下来. 感谢您的帮助,如果您有任何疑问,请与我们联系. 解决方法
正如Iain在对你的问题的评论中所说的那样,在这里工作并不多,但如果我明白你想要做什么,这样的事情应该有效:
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 苹果新的编程语言 Swift 语言进阶(九)--方法和下标
- c# – 将60m记录导入SQL的最快方法是什么
- 【呆萌の学习】分析一个“简单”的项目来学习react-native
- PostgreSQL+PostGIS安装以及用Osmosis导入openstreetmap地图
- 四个类搞定分层自动化测试框架
- SQLite函数详解之二
- 移植sqlite3.7.8到s3c2410
- 如何从[C#WP8.1 WRT / SL]项目调用[Unmanaged C DLL func]
- c# – 更改具有“return”和“yield return”的方法
- ruby-on-rails – Rails:删除capybara,bug或我的错误请求?