1

ゲームでいくつかのサーバーにpingを実行したいのですが、それらはすべて同じ形式であり、おそらく数百台しかない場合があります。これは私が現在使用しているものです:

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

これにより、サーバーに20回pingが実行され、最小のping量以外はすべて切り取られます。これらのサーバーの300にpingを実行する場合、同じ行を300回貼り付ける必要があります...同じものを300行も必要とせずに、1行に1-300のようなものを指定することはできますか?

4

3 に答える 3

2

xargsの仕事のように聞こえます、例えば、

$ cat server-list | xargs -I% ping % -n 20 ...
于 2013-02-18T23:53:53.013 に答える
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
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コマンドはあなたのpingコマンドとは異なるはずだと思います。私はこのアイデアをDebianマシンで作成しています。

構文の代わりに-n count、、および「Minimum」を含む行の代わりに、「min / avg / max/mdev」があります。したがって、構文などを試す必要があるかもしれません。とにかく、それを念頭に置いて、必要に応じて以下を変更し、各サーバーのpingを1からエラーになるまで順番に実行します。ping-c countgrep

#!/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ミリ秒間隔で20回pingを実行し、エコーされた行を(ping結果からスクレイピングして)前に10進数を付けて完成させます。等間隔。(このパターンは、Linux iputilsの要約の最小ping時間の結果と一致しますping。)pingが失敗した場合、終了コードは0に等しくなく、ループが中断されます。

于 2013-02-18T23:34:43.623 に答える