Windows OS標準でも「findstr」なら正規表現で検索できます(注意点あり)Tech TIPS

さまざまなパターンで文字列を検索するには「正規表現」が使えると便利だ。Windows OSでは、標準装備の「findstr」コマンドが正規表現に対応している。ただし、使い方には注意が必要だ。

» 2023年01月11日 05時00分 公開

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Tech TIPS」のインデックス

連載目次

grepがないならfindstrを使えばいいじゃない!?

対象OS:Windows 10/11、Windows Server 2012/2012 R2/2016/2019/2022


Windows OSで正規表現による文字列検索をしたい!

 メモやログといったテキストファイルから、いろいろなパターンで文字列を検索して目的の情報を見つけたい。そのようなときに便利なのが「正規表現」による文字列検索だ。固定の検索文字列に比べ、はるかに多様なパターンの文字列をずっと少ない記述で見つけ出せる。

 UNIX/Linux環境に慣れているなら、解決策として「grep」コマンドや「egrep」コマンドが思い浮かぶのではないだろうか。しかし、Windows OSにはgrepは標準装備されていない。

 その代わり、「findstr.exe」というコマンドラインコマンドを利用すると、正規表現を使った検索機能が利用できる。本Tech TIPSでは、その使い方を説明したい。ただ制限もあるので、使用上の注意点の他、代替策も紹介する。

findstrコマンドの基本的な使い方

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

findstr [オプション<検索文字列> <ファイル名><次のファイル名>……



findstrコマンドの基本的な使い方 findstrコマンドの基本的な使い方

 findstrコマンドの場合、<検索文字列>はデフォルトでは正規表現として取り扱われる。

 また、<検索文字列>に特別な文字を含めている場合は、ダブルクオート記号("……")で囲む必要がある。基本的には、記号や空白文字といった英数字以外の文字を使用する場合は、全て囲むようにした方がよい。特に正規表現では、コマンドプロンプトで利用する特殊文字と機能がバッティングするものも少なくないので、囲む方が無難だ(ただし注意点がある。詳しくは後述)。

 findstrの主なオプションを次に挙げておく。

オプション 意味
/b 行の先頭にある文字列の検索。正規表現の「^<文字列>」と同じ
/e 行の末尾にある文字列の検索。正規表現の「<文字列>$」と同じ
/l 正規表現ではなく、単純な文字列(リテラル文字列)として検索
/r 正規表現文字列として検索。「/l」オプションの反対
/s サブフォルダにあるファイルも検索
/i 文字の大文字/小文字の区別をしない
/x 完全に一致する行を出力
/v 指定された文字列を含まない行を出力
/n 行番号情報も出力
/m 一致する場合は、ファイル名のみを出力する
/f:<リストファイル名> 指定のファイルに記載のファイル一覧を対象として検索
/c:<検索文字列> 検索文字列を明示的に指定するオプション。複数指定可(いずれかに一致すると出力される)。「/l」オプションも暗黙のうちに指定されるので、正規表現の場合は場合は「/r」オプションも同時に指定すること
<検索文字列> 検索対象の文字列。特別な文字を含む場合はダブルクオートで囲む。空白文字を検索したい場合は「/c」オプションで指定すること。「/c」オプションを指定した場合、こちらは指定不可
findstrコマンドの主なオプション
オプションの大文字/小文字の違いは無視されるので、例えば「/b」の代わりに「/B」を指定してもよい。

 上表の「/l」オプションにある「リテラル文字列」とは、一般的に、指定された文字の並びに完全に一致する文字列のことを指す。「リテラル(literal)」とは「文字通り」「表記」という意味である。

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

 以下では、findstrコマンドを使って正規表現で検索する際の注意点を中心に説明していく。

注意その1――正規表現での検索には「/r」「/c」オプションを指定すべき

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

 例えばfindstrコマンドで、単に「findstr "Windows 11 Pro" *.log」とすると、「Windows」「11」「Pro」のいずれかの文字列を含む行が全て一致する。つまりfindstrはデフォルトで、<検索文字列>をダブルクオートでくくりつつ空白で区切って指定すると、区切られた複数の文字列をそれぞれ単独の検索文字列として扱う。

 このようなデフォルトの挙動を変更し、空白文字も検索文字列の一部とするには、「/c」オプションを使用する。

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



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

findstr /c:"Windows 11" /c:"Windows 10" *.log



 ただし/cオプションを指定しただけではリテラル文字列検索(「/l」オプション付きと同等)になるので、正規表現文字列を検索するには「/r」オプションも指定する。

findstr /r /c:"^Windows 1[01] Pro" *.log



 とはいえ検索文字列の内容によってオプション指定をいちいち変えるのは面倒だ。そこで、もう正規表現を前提として「/r /c:"<検索文字列1>" /c:"<検索文字列2>"……」というように指定するよう、決め打ちにした方が覚えやすいだろう。

注意その2――findstrコマンドで使える正規表現は限られている

 正規表現の機能にはさまざまなバリエーションがある。しかし、findstrコマンドは下表のように、非常に基本的な機能しかサポートしていない。

表記 意味 例の意味
.(ピリオド) 任意の1文字に一致するワイルドカード文字 a.b a」で始まり、「b」で終わる3文字。例えば「aab」「abb」「a1b」には一致。「abc」「ab」には一致しない
* 直前の文字の0回以上の繰り返し a.*b a」で始まり、任意の文字列が続き、最後が「b」の文字列に一致。例えば「ab」「aab」「aaab」には一致
^ 行の先頭 ^Windows 行の先頭にある「Windows」に一致
$ 行の末尾 Windows$ 行の最後にある「Windows」に一致
[x] 指定された文字xのうちの任意の1文字 Windows 1[01x] Windows 10」「Windows 11」「Windows 1x」には一致。「Windows 12」には一致しない
[^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コマンドで正規表現を使って文字列を検索する findstrコマンドで正規表現を使って文字列を検索する

 例えば、以下のスクリーンショットにある正規表現は、findstrコマンドでは検索できない。

findstrコマンドで使えない正規表現の例 findstrコマンドで使えない正規表現の例

注意その3――UTF-8のテキストは正しく検索できない

 findstrコマンドが正しく検索できるのは、シフトJISのテキストに限られる。例えばUTF-8やUTF-16のテキストの場合、日本語の文字列を検索しても一致しない。

 そのため、こうしたテキストはfindstrコマンドに渡す前にシフトJISへ変換しておく必要がある。

可能なら他の検索手段も検討すべき

 以上のようにfindstrコマンドはいささか厳しい制限が付きまとっている。もしUNIX/Linux環境に慣れているなら、WSL(Windows Subsystem for Linux)あるいはGit BASHMSYS2などをセットアップして、それらの環境でgrepコマンドやegrepコマンドなどを使った方がもっとよい結果を得られるかもしれない。

 PowerShellに慣れているなら、Select-String」コマンドレット-match」演算子を使ってスクリプトを書く、という手もある。

 そうではなく、しかも新たにソフトウェアを追加インストールできず、Windows OS標準のコマンドしか使えない、というなら、正規表現の使えないfindコマンドなどと比べて、findstrコマンドは便利に使えるだろう。

findstrコマンドのヘルプを表示させるには

 「findstr /?」と実行すると、findstrコマンドのオプション覧や利用可能な正規表現などが表示される。

■更新履歴

【2023/01/11】Windows 11などに対応しました。findstrコマンドの代わりとなる検索方法を追記しました。

【2004/12/18】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

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

メールマガジン登録

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