加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 解析ns2跟踪文件

发布时间:2020-12-14 05:48:26 所属栏目:百科 来源:网络整理
导读:我正在使用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 ---
我正在使用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}

但这是我需要做的.

以新数据包添加到网络的行开头.
以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.146秒的延迟.它会对所有数据包ID执行此操作,并仅报告平均值.

有人要求我扩展一下文件的工作方式,以及我期待的内容.

该文件列出了大约10,000个数据包的描述.每个数据包可以处于不同的状态.重要的状态意味着数据包已经在路由器中排队,而r意味着数据包已被其目的地接收.

排队的数据包(所以条目)可能实际上没有被接收而是被丢弃.这意味着我们不能假设每个条目都会有一个r条目.

我想要衡量的是平均端到端延迟.这意味着,如果你看一个数据包,它将有一个排队的时间,以及它收到的时间.我需要进行此计算以找到其端到端延迟.但我还需要为9,999个其他数据包执行此操作以获得平均值.

我已经考虑过了更多,并且通常我认为算法需要工作.

>删除所有不以a或r开头的行,因为它们不重要.
>遍历所有数据包ID(即-i之后的数字,例如示例中的1052),并将它们放入某种类别(可能是多个数组).
>现在,每个组都应包含有关特定数据包的所有信息.
>在小组内部,检查是否有,理想情况下我们想要第一个.记录它的时间.
>寻找更多的线条.看看他们的时间.日志可能有点混乱.所以它可能会在以后有一条线,实际上在模拟的早期.
>如果此新行具有较早的时间,则使用该行更新时间变量.
>假设没有更多的线,寻找一条r线.
>如果没有r行,则丢弃数据包,所以不要担心.
>对于您找到的每一条r线,我们需要做的就是找到具有最新时间戳的那条线
>带有最新时间戳的r行是最终收到数据包的位置.
>从r时间减去时间,这为我们提供了数据包传输所需的时间.
>将此值添加到数组中,以便稍后可以对其进行平均.
>在每个数据包ID组上重复此过程,然后最终平均所创建的延迟数组.

这是很多打字,但我认为它可以像我想要的那样清晰.我希望我是一个正则表达式的主人,但我没有时间去学习它,以便将其拉下来.

感谢您的帮助,如果您有任何疑问,请与我们联系.

解决方法

正如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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读