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コマンドは下表のように、非常に基本的な機能しかサポートしていない。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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