適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

【PowerShell】大量にpingを打つときに結果を1行にまとめて可読性をあげてみる

通信機器を管理していると死活監視がとても重要になります。

企業によってはネットワーク機器の死活監視のためにzabbixなどの統合システム監視ソフトウェアを導入しているかも知れません。

それでも死活監視といえば、まず出てくるのがpingコマンドです。

やっぱり統合ソフトもいいですが、現場ではpingを使う機会も多いですね。

そんなpingコマンドをPowerShellで使う際の、ちょっとしたtipsを紹介したいと思います。

環境

Windows10 64bit

pingの出力結果が冗長すぎるときがある

とっても便利で軽量なpingコマンドですが、出力結果がどうも冗長で使いづらい、ときがあります。

PS C:\> ping 192.168.2.1

192.168.2.1 に ping を送信しています 32 バイトのデータ:
192.168.2.1 からの応答: バイト数 =32 時間 =1ms TTL=64
192.168.2.1 からの応答: バイト数 =32 時間 =1ms TTL=64
192.168.2.1 からの応答: バイト数 =32 時間 =2ms TTL=64
192.168.2.1 からの応答: バイト数 =32 時間 =1ms TTL=64

192.168.2.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 1ms、最大 = 2ms、平均 = 1ms

うーん・・・長ったらしい・・・

それなりに情報もたくさん載せてくれてはいますが、用途が死活監視のためであれば、大抵の場合、応答の有無だけが知りたいところです。

今回は、PowerShellを使って、この応答を短くまとめて可読性をあげてみようという試みです。

死活監視においてpingの結果が冗長だと思う点

応答が複数行にまたがって出力される

結果は1行でまとめたい。

特に連続でpingを飛ばす場合は、一回のコマンド実行で画面がかなりの文字埋められてしまうため見づらい。

統計は不要

死活監視において知りたいのは生きているか死んでいるかの二択。

損失や時間が重要になってくるのはネットワークの品質を確かめたいとき。

機器の死活については送受信の統計、時間は不要。

3回も試行しなくてもいい

pingはICMPの一部機能を利用しているが、昨今の通信機器の品質は目を見張るものがあり、信頼性がかなり高い。

(使用しているネットワーク環境にもよるが・・・)

 大体の場合、3回も試行せずとも1回試行して応答がなかった機器は怪しいと判断できる
 大量にping打つ際は、大量に打ち終わったあと、怪しい機器だけを調査すればよい

PowerShellで簡単にまとめてみる

というわけで以上を踏まえて、PowerShellを使って応答を1行にまとめてみることにします。

 
$p=(ping 192.168.2.1 -n 1);$p[1]+$p[2]

実行結果

192.168.2.1 に ping を送信しています 32 バイトのデータ:192.168.2.1 からの応答: バイト数 =32 時間 =1ms TTL=64

1行で見やすい!

どこの宛先からどんな応答時間で返ってきたかパッとわかる!

ポイントはpingの応答を変数に格納している点と、-nオプションで試行回数を1回に指定している点です。

pingの応答を変数に格納する

pingコマンドの応答はオブジェクトではなく、ただの文字列ですが、PowerShellは複数行の文字列を配列として扱います。

そのため、応答は配列となって変数に格納され、行数で各行にアクセスすることができます。

応答の2行目と3行目を表示させることで処理結果を1行にまとめています。

結果の3行目だけでも十分じゃないかと思われる方もいるかもしれません。

PS C:\> $p[2]
192.168.2.1 からの応答: バイト数 =32 時間 =1ms TTL=64

正常に応答が返ってきてくれればこのようになるのでわかりやすいのですが、

問題は、応答が正常に帰ってこなかった場合です。

PS C:\> $p=(ping 192.168.3.1 -n 1);$p[2]
要求がタイムアウトしました。

このように応答結果を見ても、どこの宛先に対して打ったpingなのかが一目でわからないのです。

上記の例だと1件だけしかpingを打っていないので問題になりませんが、

次の例だと目も当てられません。

PS C:\> 1..3|%{$p=(ping 192.168.3.$_ -n 1);$p[2]}
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。

192.168.3.1~192.168.3.3にpingを連続して打つ例ですが、これでは、宛先が載ってこないので可読性が悪い。

そのため、応答の2行目も出力するようにしています。

PS C:\> 1..3|%{$p=(ping 192.168.3.$_ -n 1);$p[1]+$p[2]}
192.168.3.1 に ping を送信しています 32 バイトのデータ:要求がタイムアウトしました。
192.168.3.2 に ping を送信しています 32 バイトのデータ:要求がタイムアウトしました。
192.168.3.3 に ping を送信しています 32 バイトのデータ:要求がタイムアウトしました。

ちなみに配列の最初の要素は何が入っているかと言うと、何も入っていません。

PS C:\> $p[0]

pingを打ってみるとわかりますが、

PS C:\> ping 192.168.2.1

192.168.2.1 に ping を送信しています 32 バイトのデータ:
192.168.2.1 からの応答: バイト数 =32 時間 =1ms TTL=64

このように最初に空行があるためです。

-nオプションで試行回数を1回に指定する

これはWindowsのpingの標準オプションになります。

(linuxやmacだと -cオプションです。)

大量にpingを打つのに、3回も試行されると時間がかかります。

機器が生きていて応答が正常に帰ってくるならまだいいのですが、死んでいるときに3回の指向は時間的に苦痛です。

というわけで試行回数を、ここでは1回に指定してあげています。

まとめ

これらをまとめて、連続でpingを打ってあげると、多少可読性があがり、効率もよくなるかと思います。

PS C:\> 1..3|%{$p=(ping 192.168.2.$_ -n 1);$p[1]+$p[2]}
192.168.2.1 に ping を送信しています 32 バイトのデータ:192.168.2.1 からの応答: バイト数 =32 時間 =1ms TTL=64
192.168.2.2 に ping を送信しています 32 バイトのデータ:192.168.2.122 からの応答: 宛先ホストに到達できません。
192.168.2.3 に ping を送信しています 32 バイトのデータ:192.168.2.122 からの応答: 宛先ホストに到達できません。

こんな感じに。

多少はマシかと・・・。

終わりに

pingの結果をまとめて可読性をあげる試みでした。

大量にping打つときに地味に重宝してます、マジで。

さらにこれを分析したいなんてときは、出力にタイムスタンプなんかをまぜてあげても面白いかも知れませんね。

少しでも誰かの役に立てば・・・。

ここまでお読みいただき、ありがとうございました。

その他ping系記事

PowerShellでpingにタイムスタンプを付加する - 適材適所

PowerShellっぽいpingの連続送信 - 適材適所

【PowerShell】IPアドレスの設定をDHCPから固定IPにするときはDNSの登録も忘れずに - 適材適所