Windowsのコマンドプロンプトで、ログファイルなどから特定の文字列を検索するときに便利な findstr コマンド。
空白で区切って複数のキーワードを指定すると、「AまたはBまたはCが含まれる行」を検索できるOR条件(複数単語検索)になりますよね。
findstr "単語1 単語2 単語3" sample.txt
しかし、このOR条件で検索する単語をどんどん増やしていき、「10個以上」並べた途端、該当する文字列が確実に含まれているテキストであっても、なぜか何も表示されなくなる(ヒットしなくなる)という謎の現象に遭遇したことはありませんか?
「自分のタイポかな?」と思いがちですが、実はこれ、findstrコマンドが持つ恐ろしい罠(制限)なのです。
🚨 原因:findstrの複数単語検索は「9個まで」のバグ・制限がある
結論から言うと、あなたの直感は完全に正解です。 Windowsの findstr コマンドは、スペース区切りによるOR条件のキーワードを「9個」までしか正常に処理できないという、非常に古い制限(仕様、あるいは事実上のバグ)を持っています。
10個以上の単語を指定すると、エラーを吐くわけでもなく、「ただ静かに、何もヒットさせずに終了する」という最悪の挙動を示します。これを知らないと、「ログに該当のエラーは1件もなかったな」と重大な見落としをしてしまう原因になりかねません。
さらに厄介なことに、/G:ファイル名 オプションを使って、検索したい単語を改行区切りで書いた外部ファイルから読み込ませる方法でも、単語が15個〜数十個を超えたあたりで同様に検索が壊れるケースが報告されています。
要するに、「findstrに複雑な複数条件を任せるのは危険」ということです。
🛠️ 10個以上のOR条件で検索したいときの回避策
この「9個の壁」を突破し、安全に10個以上のキーワードでOR検索を行いたい場合は、以下の2つの方法のいずれかに切り替えるのがスマートです。
解決策1:正規表現のパイプ(|)を使う(単語数が少ない場合)
findstr の /R オプション(正規表現)を使い、単語の間を \|(パイプのバックスラッシュエスケープ)で繋ぐ方法です。この方法であれば、10個以上の単語でも正常にOR検索が行えます。
findstr /R "単語1\|単語2\|単語3\|...\|単語10\|単語11" sample.txt
※コマンドプロンプト上でエスケープが必要なため、縦棒の前に \(環境によっては円マーク)を入れるのを忘れないようにしてください。
解決策2:【推奨】PowerShellの「Select-String」を使う
もし今後の運用バッチなどで使うのであれば、古いコマンドプロンプトの findstr は諦めて、PowerShellの Select-String(内部的には .NETの完璧な正規表現)を使うのが最も安全で確実です。
PowerShellを開き、以下のように実行します。
Select-String -Path "sample.txt" -Pattern "単語1","単語2","単語3", ... ,"単語11"
PowerShellの -Pattern 引数は、カンマ区切りで配列として複数の単語を渡すことができ、個数の制限は事実上ありません。 10個でも100個でも、確実にOR条件でヒットさせてくれます。
大文字・小文字を区別したくない場合は、後ろに -CaseSensitive を「つけない」だけでOKです(デフォルトで区別なし)。
📝 まとめ:findstrの「10個以上の沈黙」に気をつけよう
手軽で便利な findstr ですが、「10個以上の単語を並べると、エラーも出さずに黙り込む」という致命的な弱点があります。
-
単語が9個以内 ➔
findstr "A B C"でOK -
単語が10個以上 ➔ 正規表現形式にするか、おとなしくPowerShellの
Select-Stringに乗り換える
このルールを覚えておくだけで、「あるはずのデータが見つからない!」という不毛なトラブルを未然に防ぐことができます。コマンドの隠れた罠に引っかからないよう、ぜひ打つ手を変えてみてくださいね!
