1

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

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

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

4

3 回答 3

2

您可以使用循环:

while read line
do
    ping $line.servername.com -n 20 | grep Minimum | awk '{print $3}' | sed s/,// >> Output.txt
done < servers_list
于 2013-02-18T23:25:38.523 回答
2

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

$ cat server-list | xargs -I% ping % -n 20 ...
于 2013-02-18T23:53:53.013 回答
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,而不是包含“Minimum”的行,我有“min/avg/max/mdev”。因此,您可能需要使用grep语法等。无论如何,考虑到这一点,根据需要修改以下内容以按顺序执行每个服务器的 ping 从 1 到任何直到错误为止。

#!/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 时,回显服务器名称而不使用换行符,并以 200 毫秒的间隔 ping 它 20 次,用(从 ping 结果中刮取)前面的十进制数完成回显等空间。(该模式与 Linux iputils 摘要中的最小 ping 时间结果匹配ping。)如果 ping 失败,退出代码将不等于 0,并且循环将中断。

于 2013-02-18T23:34:43.623 回答