在一个脚本中ping数百个

时间:2013-02-18 23:23:39

标签: bash shell ping

我想ping游戏上的一些服务器,它们都是相同的格式,只有可能有数百个。这就是我目前使用的:

ping server1.servername.com -n 20 | grep Minimum | awk '{print $3}' | sed s/,// >> Output.txt

这会对服务器执行20次ping操作,并切断除最小ping数量之外的所有内容。如果我想ping 300这些服务器,我必须将相同的行粘贴300次...是否可以让它在一行中指定1-300这样的东西而不需要300行相同的东西?

3 个答案:

答案 0 :(得分:2)

你可以使用循环:

while read line
do
    ping $line.servername.com -n 20 | grep Minimum | awk '{print $3}' | sed s/,// >> Output.txt
done < servers_list

答案 1 :(得分:2)

rojo@aspire:~$ help for

<snip...>

for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
    Arithmetic for loop.

    Equivalent to
        (( EXP1 ))
        while (( EXP2 )); do
            COMMANDS
            (( EXP3 ))
        done
    EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is
    omitted, it behaves as if it evaluates to 1.

尝试这样的事情:

for (( x=1; $x<=300; x++ )); do ( ping server$x.servername.com -n 20 | grep Minimum | awk '{print $3}' | sed s/,// >> Output.txt ); done

<强>更新

以下是我在下面对这个答案的评论中提到的一个黑客的想法。警告:我认为我的ping命令必须与你的不同。我正在Debian机器上创作这个想法。

而不是-n count我的ping语法是-c count,而不是包含“最小”的行,而是“min / avg / max / mdev”。因此,您可能需要使用grep语法等等。无论如何,考虑到这一点,根据需要修改以下内容,按顺序从1执行ping每个服务器直到错误。

#!/bin/bash
i=0
while [ $? -eq 0 ] && i=$(( i + 1 )); do (
        echo -n "server$i min: "
        ping server$i.servername.com -c 20 -i 0.2 | grep -P -o -e '(?<=\= )\d\.\d+'
); done
echo "n/a"

基本上用简单的英语,这意味着当退出代码= 0并且增加i时,回显服务器名称而没有换行符并以200ms的间隔对其进行20次ping操作,完成回显的行(从ping结果中抓取)一个小数数字前面有一个等空格。 (该模式匹配Linux iputils ping摘要中的最小ping时间结果。)如果ping失败,退出代码将不等于0并且循环将中断。

答案 2 :(得分:2)

听起来像是xargs的工作,例如,

$ cat server-list | xargs -I% ping % -n 20 ...