【问题标题】:get the arithmetic average using shell使用shell获取算术平均值
【发布时间】:2013-01-21 14:03:38
【问题描述】:

以下是 ping 2 urls 的输出。

PING www.abc.com (96.126.98.69):56 个数据字节 来自 96.126.98.69 的 64 个字节:icmp_seq=0 ttl=43 time=444.812 ms 来自 96.126.98.69 的 64 个字节:icmp_seq=1 ttl=43 time=467.554 ms --- www.abc.com ping 统计 --- 发送 2 个数据包,接收 2 个数据包,0.0% 数据包丢失 往返 min/avg/max/stddev = 444.812/456.183/467.554/11.371 ms PING www.kkk.com (90.187.36.10):56 个数据字节 来自 90.187.36.10 的 64 个字节:icmp_seq=0 ttl=51 time=404.907 ms 来自 90.187.36.10 的 64 个字节:icmp_seq=1 ttl=51 time=427.510 ms --- www.kkk.com ping 统计 --- 发送 2 个数据包,接收 2 个数据包,0.0% 数据包丢失 往返 min/avg/max/stddev = 404.907/416.208/427.510/11.302 ms

我想得到每个ip时间的算术值。喜欢

96.126.98.69 a_time = 456.183 90.187.36.10 a_time = 416.208

我可以使用以下代码随时间获取每个 ip:

cat out | grep "64 bytes"

但我不知道如何获得每个 ip 的算术平均值。

【问题讨论】:

    标签: shell awk


    【解决方案1】:

    尝试这样做:

    num=2
    cat ips |
    xargs -n1 ping -c $num |
    awk -vnum=$num -F'[ =:]' '
        /^[0-9]+ bytes +from/{
            ips[$4]+=$11
        }
        END{
            for (ip in ips) print ip, "a_time =", ips[ip]/num
        }
    '
    

    输出示例

    127.0.0.1 a_time = 0.0225
    8.8.8.8 a_time = 25.7
    

    说明

    • 我使用 将毫秒添加到以 ip 为键的数组中
    • @结束,我遍历数组并除以num变量整数(这里是2)
    • 我用空格分隔列,=: 使用 -F 开关

    【讨论】:

      【解决方案2】:

      awk 一个班轮怎么样:

      awk -F'[:= ]' '/^64 b/{a[$4]+=$11}END{for(k in a)print k,"a_time =",a[k]/2}' out
      90.187.36.10 a_time = 416.208
      96.126.98.69 a_time = 456.183
      

      如果您将数据包的数量从ping -c 2 增加到ping -c 5,然后将最后一个a[k]/2 更改为a[k]/5,您可以选择使用awk 选项-v 将值作为变量传递.

      【讨论】:

      • 那么,你会重写我所有的答案吗?
      • 也许 OP 想要一个简洁的解决方案。
      • -c 不增加数据包而是增加尝试次数。
      • man ping-c count - Stop after sending count ECHO_REQUEST packets
      猜你喜欢
      • 1970-01-01
      • 2011-12-04
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2011-06-03
      相关资源
      最近更新 更多