連載
» 2004年12月18日 00時00分 UPDATE

Tech TIPS:Windowsのfindstrで正規表現を検索する

findコマンドでは固定的な文字列検索機能しか利用できない。findstrコマンドを利用すると、正規表現を使った柔軟な文字列検索が行える。ただし、grepとまったく同じではない。

[打越浩幸,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 2000/Windows XP/Windows Server 2003



解説

 コマンド・プロンプト上でテキスト・ファイルから文字列を検索する場合、Windows OSでは、従来はfindコマンドを利用することが多かった。これは古くはMS-DOSの時代から利用できるコマンドであり、慣れ親しんでいるユーザーも多いだろう。

 だがfindコマンドの持つ検索機能は非常に限定的であり、固定的な文字列しか検索することができなかった。UNIX/Linuxなどのgrep系コマンドで一般的な、ワイルド・カードを使った文字列の検索すらサポートされていなかったのである。

 その代わり、findstr.exeというコマンドを利用すると、正規表現を使った検索機能が利用できる。とはいえ、grepとまったく同じかというとそうではなく、オプション・パラメータや機能などに少々“クセ”があるし、正規表現で利用できる機能にも少し違いがあるので、注意が必要である。

操作方法

 findstrコマンドの基本的な使い方は、コマンド・プロンプト上で「findstr /?」を実行すると表示されるほか、Windowsのヘルプでfindstrのコマンドの項を開くと表示されるので、参考にしていただきたい。

●findstrの基本的な使い方

 findstrの基本的な使い方は、次のようになっている。

findstr [パラメータ] 検索文字列 [ファイル名群]



 これだけならばfindコマンドとほぼ同じであるが、「検索文字列」はデフォルトでは正規表現として取り扱われるところが異なっている。

 findコマンドと違って、特別な文字を含まなければ検索文字列をダブルクォート記号("……")で囲む必要はないが、もちろん囲んでもよい。基本的には、英数字以外の文字(記号や空白文字など)を使用する場合は、すべて囲むようにした方がよいだろう。特に正規表現では、コマンド・プロンプトで利用する特殊文字と機能がバッティングするものも少なくないので、単純な英数字以外の場合は囲むようにするのがよいだろう。

 findstrの主なパラメータを次に挙げておくが、検索文字列として正規表現が利用できること以外はあまり差はない。

パラメータ 意味
/B 行の先頭にある文字列の検索。正規表現の "^文字列" と同じ
/E 行の末尾にある文字列の検索。正規表現の "文字列$" と同じ
/L 正規表現ではなく、単純な文字列(リテラル文字列)として検索。/C未使用時のデフォルト
/R 正規表現文字列として検索。/Lの反対。/C使用時のデフォルト
/S サブフォルダも検索
/I 文字の大文字/小文字の区別をしない
/V 指定された文字列を含まない行を出力
/N 行番号情報も出力
/M 一致する場合は、ファイル名のみを出力する
/C:文字列 指定された文字列を「リテラル文字列」として検索。複数指定可。これを指定すると/Lが仮定されるので、正規表現を利用したい場合は/Rも指定すること
文字列 検索対象の文字列。特別な文字を含む場合はダブルクォートで囲む。空白文字を検索したい場合は/C:オプションで指定すること。/C使用時はこちらは指定できない
findstrコマンドの主なパラメータ
パラメータ指定では大文字/小文字の違いは無視されるので、例えば/Bの代わりに/bでもよい。

●「正規表現文字列」と「リテラル文字列」の違いに注意

 findstrでは指定された検索文字列がダブルクォート記号で囲まれている場合は、デフォルトでは少し特殊な取り扱いをしているので注意が必要である。

 例えばfindコマンドで「find "Windows Server 2003" *.log」と指定すれば、この文字列の並びがそのまま含まれている行だけが検索される。

 このように、指定された文字の並びに完全に一致する文字列のことを一般的には「リテラル文字列」と呼ぶ。「リテラル(literal)」とは「文字どおり」とか「表記」という意味である。

 だがfindstrコマンドで、単に「findstr "Windows Server 2003" *.log」とすると、「Windows」「Server」「2003」のいずれかの文字列を含む行がすべて検索されることになる。つまりfindstrでは、空白で区切って、複数の検索対象文字列を指定できるようになっているのである(複数の正規表現を指定するには、例えば"^Windows ^Server 2003$"のようにする)。

 このようなデフォルトの設定を変更し、空白文字も検索文字列の対象にするには、/cオプションを使用する。

findstr /c:"Windows Server 2003" *.log
※注意:/cと文字列を「:」で連結すること。/cだけを単独で記述してはいけない



 空白を含む文字列が複数ある場合は、すべて/cオプション付き文字列にして、複数指定すればよい(/cなしの検索文字列は1つしか指定できない)。

findstr /c:"Windows Server" /c:"Windows XP" *.log



 ただし/cを指定するとリテラル文字列検索(/l)になるようなので、空白を含む正規表現文字列を検索するには/rオプションも指定する。

findstr /r /c:"^Windows Server" *.log



●正規表現について

 「正規表現(regular expression)」とは、一般的には文字の検索などに使われる、特別な文字シーケンスのことである(「正則表現」とも呼ばれる)。

 正規表現の機能にはさまざまなバリエーションがあるが、このfindstrでは非常に基本的な機能しかサポートされていない。以下にその説明と例を示しておく。より詳細な説明は、Windowsヘルプでfindstrの説明などを参照していただきたい。

表記 意味 例の意味
. 任意の1文字に一致するワイルド・カード文字 a.b aで始まり、bで終わる3文字。例えばaab、abb、a1bはマッチするが、abcはマッチしない
* 直前の文字の0回以上の繰り返し a.*b aで始まり、任意の文字列が続き、最後がbの文字列にマッチ。例:ab、aab、aaabなどにマッチ
^ 行の先頭 ^Windows 行の先頭にあるWindowsにマッチ
$ 行の末尾 Windows$ 行の最後にあるWindowsにマッチ
[x] 指定された文字xのうちの任意の1文字 Windows 9[58x] Windows 95、Windows 98、Windows 9xにマッチするが、Windows 97にはマッチしない
[^x] 指定された文字x以外の文字 win[^ds] wineやwinoなどにはマッチするがwindやwinsにはマッチしない
[x-y] 文字範囲の指定。指定された範囲内の任意の1文字 [a-z][a-z0-9]* 英字で始まり、任意の数の英数字が続く文字列にマッチ
\x 文字のエスケープ。特殊文字を指定する場合に使用 \[a\] [a]という文字列にマッチ
\< 単語の先頭 \<win winで始まる単語にのみマッチ。2文字目以降にwinがある単語にはマッチしない
\> 単語の末尾 \<win\> winという3文字の単語にのみマッチ。ほかの単語の一部の場合はマッチしない
findstrで利用できる正規表現とその例
findstrでは、非常に限定的な正規表現しか利用できない。文字列中で正規表現を利用する場合は、コマンド・プロンプトの特殊文字指定と衝突しないように、必ずダブルクォートでくくる必要がある。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。