Bash 从跟踪路由提取最高延迟的脚本

Bash 从跟踪路由提取最高延迟的脚本,bash,latency,awk,Bash,Latency,Awk,我正在寻找一个脚本,它可以从traceroute中提取延迟跳数最高的行。理想情况下,它会逐行查看3个值的最大值或平均值。我怎么能这样呢 这就是我迄今为止所尝试的: traceroute www.google.com | awk '{printf "%s\t%s\n", $2, $3+$4+$5; }' | sort -rgk2 | head -n1 traceroute -w10 www.google.com | awk '{printf "%s\t%s\n", $2, ($

我正在寻找一个脚本,它可以从traceroute中提取延迟跳数最高的行。理想情况下,它会逐行查看3个值的最大值或平均值。我怎么能这样呢

这就是我迄今为止所尝试的:

     traceroute www.google.com | awk '{printf "%s\t%s\n", $2, $3+$4+$5; }' | sort -rgk2 | head -n1
     traceroute -w10 www.google.com | awk '{printf "%s\t%s\n", $2, ($3+$4+$5)/3; }' | sort -rgk2 | head -n1
这似乎是朝着正确的方向迈出的一步,除了从跟踪路由返回的一些值是*,因此总和和平均值都提供了错误的值

更新 更进一步:

     traceroute www.cnn.com | awk '{count = 0;sum = 0;for (i=3; i<6; i++){ if ($i != "*") {sum += $i;count++;}}; printf "%s\t%s\t%s\t%s\n", $2, count, sum, sum/count }' | sort -rgk2
你必须

  • 开始追踪路线
  • 收集每条输出线(此处管道可能工作良好)
  • 使用类似于
    • 分析该行并提取所需信息
    • 将刚得到的值与以前的值进行比较,并在适当的情况下存储当前行
    • 在输入结束时,打印存储的值

    • Stephan,你可以尝试使用pchar作为pathchar的衍生物。它应该在Ubuntu存储库中

      不过我需要一段时间才能跑,所以你需要一些耐心。它将向您显示吞吐量,这将比确定瓶颈的延迟要好得多

      以下是一个例子:

      rayd@raydHPEliteBook8440p ~ sudo pchar anddroiddevs.com
      pchar to anddroiddevs.com (31.221.38.104) using UDP/IPv4
      Using raw socket input
      Packet size increments from 32 to 1500 by 32
      46 test(s) per repetition
      32 repetition(s) per hop
       0: 192.168.0.20 (raydHPEliteBook8440p.local)
          Partial loss:      0 / 1472 (0%)
          Partial char:      rtt = 6.553065 ms, (b = 0.000913 ms/B), r2 = 0.241811
                             stddev rtt = 0.196989, stddev b = 0.000244
          Partial queueing:  avg = 0.012648 ms (13848 bytes)
          Hop char:          rtt = 6.553065 ms, bw = 8759.575088 Kbps
          Hop queueing:      avg = 0.012648 ms (13848 bytes)
       1: 80.5.69.1 (cpc2-glfd6-2-0-gw.6-2.cable.virginm.net)
      
      使用mtr--raw-c1google.com。它更快更容易解析。

      试试:

      $ traceroute 8.8.8.8 | awk ' BEGIN { FPAT="[0-9]+\\.[0-9]{3} ms" }
                                 /[\\* ]{3}/ {next}
                                 NR>1  {
                                         for (i=1;i<4;i++) {gsub("*","5000.00 ms",$i)}
                                         av = (gensub(" ms","",1,$1) + gensub(" ms","",1,$2) + gensub(" ms","",1,$3))/3
                                         if (av > worst) {
                                           ln = $0
                                           worst = av
                                         }
                                       }
                                 ND { print "Highest:", ln, " Average:", worst, "ms"}'
      

      如果有三个asterix(asteri?
      ***
      ,脚本将假定跃点没有响应IGMP响应,并完全忽略它。如果一行中有一个或两个
      *
      ,它会给它们5.0秒的值。

      @stwissel有一些$$$要传递给我吗?我们通常不会编写脚本,也不会为他们做别人的工作,但如果你向我们展示你的工作,我们很乐意为你指出正确的方向,甚至调试东西。在glass上的最初问题,现在添加了我到目前为止所做的尝试。对于“干净”的跟踪路由,我有一个解决方案,但是当*返回时需要一个步骤嗯-在所有情况下都除以3,所以如果我有110.666ms*159.334ms,我会得到90ms,这不是135ms的准确平均值。我想问题是缺少
      *
      的定义。在您的评论中,您选择忽略它并将其除以二。它也可以定义为5.0秒,因为这是traceroute放弃并显示asterix的时间。它也可以被定义为无穷大,因为没有反应。在后一种情况下,最坏情况下的响应可能不止一行。True。*没有定义。它在请求超时时出现。通常,当服务器配置为忽略跟踪路由时会发生这种情况。我检查了30秒的超时,仍然得到*。所以我得出结论,不管怎样,忽略等于假设一个值(超时-默认3sec-将是合适的),Awk将其变为零。但是,如果有2个值并除以3,则不会产生可用的结果。我(以前)对其进行了编辑,因此如果有三个
      *
      ,则假定服务器忽略了该请求。但是,如果有一个或两个
      *
      和一个响应,那么服务器不会忽略该请求,而是需要很长的时间来响应(默认情况下>5秒)。非常感谢您坚持不懈地帮助我!
      $ traceroute 8.8.8.8 | awk ' BEGIN { FPAT="[0-9]+\\.[0-9]{3} ms" }
                                 /[\\* ]{3}/ {next}
                                 NR>1  {
                                         for (i=1;i<4;i++) {gsub("*","5000.00 ms",$i)}
                                         av = (gensub(" ms","",1,$1) + gensub(" ms","",1,$2) + gensub(" ms","",1,$3))/3
                                         if (av > worst) {
                                           ln = $0
                                           worst = av
                                         }
                                       }
                                 ND { print "Highest:", ln, " Average:", worst, "ms"}'
      
      Highest:  6  72.14.242.166 (72.14.242.166)  7.383 ms 72.14.232.134 (72.14.232.134)  7.865 ms  7.768 ms  Average: 7.672  ms