LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1310|回复: 16

一个统计站点ping值的问题

[复制链接]
发表于 2003-6-22 15:36:00 | 显示全部楼层 |阅读模式
hf问我一个问题,每天要做这么一项工作,ping一堆站点,然后统计丢包率和时间,最后形成一个表格,我搞了很久也没有交差,只好来求助了,呵呵。
表格的格式是
地址    丢包率     最小ping值    最大ping值   平均ping值

呵呵,我本来给出一个最简陋的方案:
sites="\
www.163.com \
www.sina.com.cn \
2.3.4.5 \
"

for site in $sites
do
        ping -w3 $site | tail -n3
done
可是,格式不符合领导的要求,哈哈。
看了置顶的sed和awk教程,我觉得sed和awk都可以解决,awk是不是会更适用?可惜两者我都还是门外汉,向大家请教了
发表于 2003-6-22 16:02:44 | 显示全部楼层
既然看了教程,那就继续练习啊。。
好歹这个也是你的工作
发表于 2003-6-22 18:51:25 | 显示全部楼层
哈哈,X11终于被逼得受不了了,hf也太~~~~
嗯,拿这个交差吧:
#!/bin/bash
# wrote by lyoo
# iamlyoo@163.com
# 2003/06/22

# you can set this value as you want.
count=10

for sitefile in $(cat sitefile); do
        ping -c $count -q $sitefile > /tmp/$sitefile$$
        host=$(sed -n -e 's/PING \(.*\):.*/\1/p' $sitefile$$)
        loss=$(sed -n -e 's/^[0-9].*\([0-9]\+\%\).*/\1/p' $sitefile$$)
        trip=$(sed -n -e 's/^round-trip.*= \([0-9]\+\.[0-9]\)\/\([0-9]\+\.[0-9]\)\/\([0-9]\+\.[0-9]\).*/\1ms \3ms \2ms/p' $sitefile$$)
        if [ -z "$host" ]; then
                echo "unknow $loss $trip"
        else
                echo "$host $loss $trip"
        fi
        rm -f /tmp/$sitefile$$
done

这是站点列表文件sitefile的格式:
www.163.com
www.sina.com
...

执行结果:
lyoo@lsd:/tmp$ ./pingx11.sh
www.163.com (202.108.36.167) 0% 22.9ms 26.3ms 23.5ms
jupiter.sina.com.cn (218.201.44.9) 0% 50.8ms 52.3ms 51.3ms

下次不得偷懒哦,要记住penny兄的教诲!;)
发表于 2003-6-22 19:07:06 | 显示全部楼层
我来试验一个awk的版本?

got it! 好像是目前最短的?
  1. #!/bin/bash
  2. echo -e "site\t\tloss\tmin\t\tmax\t\tavg";
  3. while read site
  4. do
  5.   tempstr=$(ping -c 3 -q $site | tail -n2);
  6.   lossrate=$(echo $tempstr | awk 'BEGIN {FS=" ";} {print $6}');
  7.   speed=$(echo $tempstr | awk 'BEGIN {FS="/";} {print $4"ms\t"$6"ms\t"$5"ms"}' | cut -d'=' -f2);
  8.   echo -e "$site\t$lossrate\t$speed"
  9. done < "$1"
复制代码

这个输出排版不太整齐,实际对齐效果还是不错的
准备改进一下,用来检验代理速度。呵呵
  1. $ ./checksite.sh site.list
  2. site            loss    min             max             avg
  3. [url]www.google.com[/url]  0%       39.700ms       126.970ms       70.411ms
  4. [url]www.yahoo.com[/url]   0%       29.075ms       36.823ms        31.832ms
  5. [url]www.gentoo.org[/url]  0%       44.990ms       168.695ms       95.887ms
复制代码
发表于 2003-6-22 19:26:49 | 显示全部楼层
嗯,不过他要求的是最大值、最小值、平均值,如果用cut的话还得算一算,所以我决定直接从ping输出结尾处的总结段落抽取现在的值。

不过,到底penny写系统维护脚本的经验比我丰富,cut我用得极少,对其功能也了解不多,我再看看cut文档去。
发表于 2003-6-22 20:01:39 | 显示全部楼层
其实就是把ping的结果如何利用sed,awk一个一个把他们提取出来就可以啦~
  1. #!/bin/ksh
  2. #
  3. for var in $(cat sitefile);do
  4. ping -c 1 $var >tmp
  5. add=$(cat tmp|head -n 1|awk '{print $3}'|sed -e 's/(//' -e 's/)//')
  6. loss=$(cat tmp|grep %|awk -F, '{print $3}'|awk '{print $1}')
  7. max=$(cat tmp|grep max|awk -F/ '{print $6}')
  8. min=$(cat tmp|grep min|awk -F/ '{print $4}'|awk '{print $3}')
  9. avg=$(cat tmp|grep avg|awk -F/ '{print $5}')
  10. print -n "IP:$(echo $add)    loss:$(echo $loss)  max:$(echo $max)  min:$(echo
  11. $min)  avg:$(echo $avg)\n"
  12. done
复制代码
sitefile:
www.linuxsir.cn
www.263.com
我作的实验是ping一次的,也可以用计数的方法把结果再统计统计!
发表于 2003-6-22 20:14:20 | 显示全部楼层
最初由 LYOO 发表
嗯,不过他要求的是最大值、最小值、平均值,如果用cut的话还得算一算,所以我决定直接从ping输出结尾处的总结段落抽取现在的值。


主要是输出格式固定,就不用考虑模式匹配了
这么一来,cut几次就可以出结果了
或者awk,这个更漂亮些

个人不太喜欢sed,感觉是可读性太差,cut写出来的东西感觉比较弱 但是容易理解

btw, 读文件用标准的loop+重定向比较合适
用cat,因为命令行有最大长度限制,扩展性受限制
另外就是,不能处理行内的空格。
发表于 2003-6-22 20:28:23 | 显示全部楼层
btw, 读文件用标准的loop+重定向比较合适
用cat,因为命令行有最大长度限制,扩展性受限制
另外就是,不能处理行内的空格。
谢谢penny兄指点!;)
 楼主| 发表于 2003-6-23 08:50:05 | 显示全部楼层
这块砖引出这么多玉,呵呵
我开始想用一行命令完成,可是看了几遍教程,没有找到头绪,不会用awk的缓冲区:(
看来大家都没有我那么笨,呵呵,先把ping的结果保存起来了,这样好。谢谢大家的指点,呵呵
发表于 2003-6-23 11:23:53 | 显示全部楼层
嗯,awk的确漂亮,虽然条条大路通罗马,但还是有很大差别的,sed、awk、cut、grep各有优势,这回又长经验了,
thx penny  javalee 还有 x11出了个好题 : )

BTW:penny的操作系统不是linux吧?你的脚本在我的系统上需要作些小调整。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表