FreeBSD sh での ping 時間の比較

FreeBSD sh での ping 時間の比較

Ping の返信から時間を削除するにはどうすればよいですか? 例:

64 bytes from 10.3.0.1: icmp_seq=0 ttl=63 time=2.610 ms

その後の値を取得してtime=、次のようなテストに渡したいと思います。

if time>=50.0; then do_something; fi

答え1

timeしたがって、ラベルなしで値だけを取得したい場合は、次のようにしますms

HOST="127.0.0.1"
PING_MS=`ping -c1 "$HOST" | /usr/bin/awk 'BEGIN { FS="=" } /time=/{gsub(/ ms/, ""); print $NF; exit}'`

これにより、次のようになります。

0.058

ここで、 かどうかをテストしたい場合、POSIX自体は 10 進数を比較できないため、 もtime>=50.0使用できます。awksh

if echo $PING_MS | awk '{exit $1>=50.0?0:1}'; then
    echo "Ping time is >= 50.0ms."
fi

これを次のように短縮することもできます。

if ping -c1 "$HOST" | /usr/bin/awk 'BEGIN { FS="=" } /time=/{gsub(/ ms/, ""); exit $NF>=50.0?0:1}'; then
    echo "Ping time is >= 50.0ms."
fi

FSはフィールド区切り文字であり、$NF常に最後のフィールドです。$NF>=50.0?0:1最後のフィールドが ; の場合は成功終了コードで終了し>=50.0、そうでない場合はエラー終了コードで終了します。 ./time=/を含む行のみに一致し、文字列からtime=.gsub(/ ms/, "");を削除します。" ms"

関連情報