1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShellでのmatchコマンドの使用方法について解説

2022-02-04 09:25:38

1. 配列のフィルタリング

この記事では、PowerShellのmatch演算子を正規表現とともに使用して、配列から目的のコンテンツをフィルタリングする方法について説明します。

まずは、次の例から見てみましょう。

PS C:\UsersHong\> (ipconfig) -match 'IPv4'
  IPv4 address . . . . . . . . . . . . : 192.168.1.102
  IPv4 address . . . . . . . . . . . . : 192.168.193.1
  IPv4 address . . . . . . . . . . . . : 192.168.93.1



ipconfigは、現在のコンピュータのTCP/IP設定情報を表示することが分かっており、そのうちの1つがIPアドレスです。NICが複数ある場合や、サイト内に複数のIPアドレスが設定されている場合、それらを非常にわかりやすく表示することができます。このipconfigを例にして、マッチオペレーターフィルタリング配列の機能を説明しましょう。

ipconfigの実行結果は、おおよそこのようになるはずです。

PS C:\UsersHong\> (ipconfig)

Windows IP Configuration

Wireless LAN Adapter Local Connection* 13:

  Media Status . . . . . . . . . . . . : Media is disconnected
  Connecting to a specific DNS suffix . . . . . . . :

Wireless LAN adapter Wi-Fi:

  Connecting to a specific DNS suffix . . . . . . . :
  Local link IPv6 address. . . . . . . . : fe80::a438:a0ec:e477:94c6%12
  IPv4 address . . . . . . . . . . . . : 192.168.1.102
  Subnet Mask . . . . . . . . . . . . : 255.255.255.0
  Default gateway . . . . . . . . . . . . . : 192.168.1.1

...... (other NICs are omitted here)



ローカルに設定されたIPアドレスを見たいのであれば、IPv4で始まる行だけを見ればいいのです。そして、マッチするキーワードとして "IPv4"を使用すればよいのです。ということで、PowerShellコマンドはこう書くことになる。
(ipconfig) -match 'IPv4'。

なぜここでipconfigは括弧で囲まれているのでしょうか?なぜなら、ipconfig 自身がいくつかの引数を持っていることを知っていて、システムが -match も ipconfig に割り当てた引数だと勘違いしないように、ipconfig を括弧で囲んでいるのです。括弧は優先され、ipconfig が独立した全体であることをシステムに伝えているのです。

この例では、ipconfigの実行結果は文字列の配列になります。配列の各要素は出力の各行であり、配列の要素の数だけ出力があることになります。matchパラメータは、配列の要素からマッチを見つけ、マッチした要素を出力することによって、配列に対して操作を行います。

2. マッチによるコンテンツの抽出

正規表現のもう一つの重要な用途は、文字列が正規表現の規則にマッチするかどうかを判断する以外に、文字列から指定された内容を抽出することである。どういうことだろうか。例えば、ある文字列の中に連続した3つの数字があり、その3つの数字を簡単に抽出したい場合、正規表現を使用することができます。

PS C:\Users\Hong> $str="abc123abc"
PS C:\Users\Hong> $pattern="(\d{3})"
PS C:\Users\Hong> $str -match $pattern
True
PS C:\Users\Hong> $matches

Name Value
---- -----
1 123
0 123



上記の例では、連続する3桁の数字123を含む文字列 $str="abc123abc" を指定しています。また、正規表現である$pattern変数を定義しています。matchを直接実行すると、出力はtrueとなり、$str文字列の中に3桁の連続した数字があることを示す。
もう一度$matchesを実行すると、出力は123となり、これがマッチした値です。変数$matchesはカスタムではなく、システム変数です。このシステム変数は、match演算子を実行したときに自動的に値を取得します。

なぜ$matchesが2つの値を持つのかを説明するために、上の例を参考にして、修正してみましょう。その違いを見てみよう。

PS C:\Users\Hong> $str="abc123abc"
PS C:\Users\Hong> $pattern="abc(\d{3})"
PS C:\Users\Hong> $str -match $pattern
True
PS C:\Users\Hong> $matches

Name Value
---- -----
1 123
0 abc123



変数$patternの値の前にabcを付けて修正し、$matches[0]の値はabc123となり、$matches[0]が正規表現にマッチすることを意味するようになりました。また、$matches[1]以降の内容は、片方の括弧の中にある正規表現の内容に対応する。この例では、括弧は1つだけで、それも$matches[1]だけです。もし正規表現が複数の括弧を持っていたら、複数の$matches要素の値があることを想像してください。