Powershell: 語句に含まれる指定文字の個数を数える

Powershellで、語句に含まれる / スラッシュの数を数えようとして一苦労したので、そのメモを残すことにします。

時々 Cisco のスイッチへログインする機会があるので、ファイルをダブルクリックするだけで、ログインして必要な処理を行うTeraTermマクロを作っているのですが、ログインするスイッチのが何種類かあり、スイッチ種類やOSバージョンの違いやの理由で、ログ処理の仕方を切り替えないといけません。

以下は、Web検索で見つけた Ciscoスイッチで show interfaces status を行った出力結果なのですが、目下の課題はスイッチのポートの指定の仕方。

ポート1を “gi1/0/1″と指定するものと、”gi0/1″と指定するものがあります。スイッチの種類によるものらしいのですけど、故障が起きたりすると私の知らないところでスイッチは入れ替わるので時々スイッチをポーリングして、マップを作っておきたいと考えています。

Switch# show interfaces status

Port      Name               Status       Vlan       Duplex  Speed Type
Gi1/0/1                                notconnect   1             auto   auto 10/100/1000BaseTX
Gi1/0/2   example-server-1   connected    1          a-full a-1000 10/100/1000BaseTX
Gi1/0/3   example-server-2   connected    1          a-full a-1000 10/100/1000BaseTX
Gi1/0/4   example-server-3   connected    2          a-full a-1000 10/100/1000BaseTX
Gi1/0/5   example-server-4   connected    2          a-full a-1000 10/100/1000BaseTX
Gi1/0/6                                notconnect   3             auto   auto 10/100/1000BaseTX
Gi1/0/7   example-server-5   connected    3          a-full a-1000 10/100/1000BaseTX

Switch#show interfaces status

 Port    Name               Status       Vlan       Duplex  Speed Type
 Gi0/1                      notconnect   1            auto   auto 10/100/1000-TX
 Gi0/2                      notconnect   1            auto   auto 10/100/1000-TX
 Gi0/3                      notconnect   1            auto   auto 10/100/1000-TX
 Gi0/4                      notconnect   1            auto   auto 10/100/1000-TX
 Gi0/5                      notconnect   1            auto   auto 10/100/1000-TX
 Gi0/6                      notconnect   1            auto   auto 10/100/1000-TX
 Gi0/7                      connected    1            auto   auto 10/100/1000-TX

スラッシュ / の数を数えれば、スイッチに必要なコマンドがわかるので、/ の個数を数えようとしてハタと立ち止まってしまいました。

特定文字列に特定キャラクターが含まれているかどうかは簡単に判断できますが、その個数を調べるコマンドオプションがわからない!

ポートじゃなく、特定ファイルが置いてあるディレクトリ階層の深さを知ることを例にしてもいいわけが、Unixなら絶対パスの / の個数、Windows なら \ の数を数えたいケースがあるとして、その簡単な方法は?ということです。

例えば、Unixの場合、特定文字が含まれている行だけ出力するには grep、powershell の場合は、select-string を使いますが、そこに ‘/’ が何個含まれている?とカウントするスクリプトを書こうとすると、手が止まってしまいました。

あーでもない、こうでもないと、いろいろ試して、コマンドオプションをチェックして適当なものが見つからず、結局 Web検索してヒントが見つかりました。

「目的文字を消去して、消去前の文字列の長さと消去後の長さを比較すればよい」ということでした。

さて、これを powershell で表現すると、以下のようになります。

$line="Gi1/0/1                                notconnect   1             auto   auto 10/100/1000BaseTX"
$port=$line.Split(" ")[0]
$num=$port.Length - ($port -replace "/","").Length
echo $num
2

(判定は)1行で行えます。

1行目は、ターミナルの出力結果の1行分。コマンドで読み込ませてもいいですけど、サンプルなので行をまるまるコピーしてあります。
2行目は、ポート番号全体を切り出します。
3行目で、/ をカウント。
4行目は個数の表示。この場合は、2個の/ が見つかりました。

ポート情報が定型長出力の後ろの方にあるなら、port情報を切り出す作業が複数行になりますが、ポート情報は先頭にあるので、split を使って切り出しました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です