バッチファイルでファイル内の文字列を検索したいとき、Windowsには FINDSTR という強力なコマンドが用意されています。
この記事では FINDSTR の基本から正規表現・複数条件・再帰検索・実務パターンまで詳しく解説します。
FINDSTR の基本構文
FINDSTR の基本構文は以下のとおりです。
BAT
FINDSTR [オプション] "検索文字列" ファイル名
最もシンプルな使い方は次のとおりです。
コマンドプロンプト
:: log.txt の中から "error" を含む行を表示
FINDSTR "error" log.txt
戻り値について
FINDSTR は一致した行が1件以上あれば終了コード 0、1件もなければ 1 を返します。バッチファイル内で IF ERRORLEVEL 1 を使って結果を判定できます。
主要オプション一覧表
| オプション |
意味 |
/I |
大文字・小文字を区別しない |
/N |
一致した行に行番号を表示する |
/V |
一致しない行を表示する(反転) |
/L |
リテラル文字列として検索(正規表現を無効化) |
/R |
正規表現として検索 |
/S |
サブフォルダを含めて再帰的に検索 |
/C:"文字列" |
文字列をそのまま(スペース含む)検索 |
/B |
行の先頭に一致する行を検索 |
/E |
行の末尾に一致する行を検索 |
/X |
行全体が完全一致する行を検索 |
/F:"ファイル" |
検索対象ファイル一覧をファイルから読み込む |
/G:"ファイル" |
検索文字列一覧をファイルから読み込む |
/M |
一致したファイル名のみを表示(行内容は表示しない) |
基本の文字列検索サンプル
ファイル内の文字列を検索する基本的な使い方です。
search_basic.bat
@echo off
:: log.txt から "ERROR" を含む行を検索
FINDSTR "ERROR" log.txt
:: 検索結果の有無をエラーレベルで判定
if %errorlevel% equ 0 (
echo ERROR が見つかりました
) else (
echo ERROR は見つかりませんでした
)
複数ファイルをまとめて検索する場合はワイルドカードが使えます。
コマンドプロンプト
:: *.log ファイルすべてから検索
FINDSTR "timeout" *.log
正規表現を使った検索(/R オプション)
/R オプションを指定すると正規表現で検索できます。ただし FINDSTR の正規表現は POSIX に比べて機能が限られています。
| パターン |
意味 |
. |
任意の1文字 |
* |
直前の文字の0回以上の繰り返し |
^ |
行の先頭 |
$ |
行の末尾 |
[abc] |
a, b, c のいずれか |
[a-z] |
a〜z の範囲 |
regex_search.bat
:: 数字で始まる行を検索
FINDSTR /R "^[0-9]" data.txt
:: IPアドレスのようなパターンを検索(簡易)
FINDSTR /R "[0-9]*.[0-9]*.[0-9]*.[0-9]*" log.txt
:: ERROR または WARNING で始まる行を検索
FINDSTR /R "^ERROR ^WARNING" log.txt
注意
FINDSTR の正規表現では +(1回以上)や ?(0か1回)は使えません。また \d などのショートハンドも使えないため、[0-9] のように文字クラスで記述します。
複数キーワードの OR 検索・AND 検索
OR 検索(いずれかに一致)
スペース区切りで複数キーワードを指定すると OR 検索になります。
or_search.bat
:: "ERROR" または "WARNING" を含む行
FINDSTR "ERROR WARNING" log.txt
スペースを含むキーワードの検索(/C: オプション)
/C: を使うとスペースを含む文字列をそのまま検索できます。複数の /C: を並べると OR 検索になります。
c_option.bat
:: "connection error" または "timeout error" を含む行
FINDSTR /C:"connection error" /C:"timeout error" log.txt
AND 検索(すべてに一致)
FINDSTR 単体では AND 検索はできません。パイプでつなげることで擬似的な AND 検索が実現できます。
and_search.bat
:: "ERROR" かつ "network" を含む行
FINDSTR "ERROR" log.txt | FINDSTR "network"
大文字・小文字を区別しない検索(/I オプション)
デフォルトでは大文字・小文字が区別されます。/I を付けると区別なく検索できます。
case_insensitive.bat
:: "error" "Error" "ERROR" すべてに一致
FINDSTR /I "error" log.txt
ポイント
実務のログ検索では英字の大文字・小文字が混在することが多いため、/I を付けておくと検索漏れを防げます。
行番号付きで表示(/N)・一致しない行を表示(/V)
/N:行番号を付与
with_line_number.bat
:: 行番号付きで検索結果を表示
FINDSTR /N "ERROR" log.txt
:: 出力例:
:: 5:2024-01-15 ERROR: Connection refused
:: 12:2024-01-15 ERROR: Timeout
/V:一致しない行を表示(反転フィルタ)
exclude_lines.bat
:: コメント行(先頭が ;)を除外して表示
FINDSTR /V "^;" config.ini
:: 空行を除外して表示
FINDSTR /V "^$" data.txt
サブフォルダを含む再帰検索(/S)
/S を使うとサブフォルダ内のファイルも含めて検索できます。/M と組み合わせるとファイル名一覧だけを出力できます。
recursive_search.bat
:: カレント以下すべての .txt から "TODO" を検索
FINDSTR /S "TODO" *.txt
:: 一致したファイル名だけを表示
FINDSTR /S /M "TODO" *.txt
実務パターン集
ログからエラー行を抽出してファイルに保存
extract_errors.bat
@echo off
set logfile=app.log
set errfile=errors.log
FINDSTR /I "ERROR CRITICAL FATAL" %logfile% > %errfile%
if %errorlevel% equ 0 (
echo エラー行を %errfile% に出力しました
) else (
echo エラーは検出されませんでした
)
CSVの特定行を取り出す
csv_filter.bat
@echo off
:: ステータスが "NG" の行だけを抽出
FINDSTR /C:",NG," result.csv > ng_list.csv
echo NG行数:
FINDSTR /C:",NG," result.csv | FIND /C ","
コマンド出力をフィルタリング
pipe_filter.bat
:: 実行中のプロセスから特定のものを検索
tasklist | FINDSTR /I "chrome"
:: netstat の結果からポート 80 を使用している行を取得
netstat -an | FINDSTR ":80 "
:: dir の結果から特定の拡張子を含む行を抽出
dir /B | FINDSTR /I "\.log$"
ファイル名一覧から検索
filelist_search.bat
@echo off
:: 2024年1月のログファイルだけを対象に検索
dir /B logs*.log | FINDSTR "202401" > target_files.txt
FINDSTR /F:"target_files.txt" "ERROR"
よくある失敗例と対処法
日本語(マルチバイト文字)が正しく検索できない
FINDSTR は基本的に ASCII および ANSI エンコードを想定しています。UTF-8 BOM なしのファイルでは日本語が正しく検索できないことがあります。
対処法
ファイルの文字コードを ANSI(Shift_JIS)に変換してから FINDSTR を実行するか、PowerShell の Select-String コマンドレットを使用することを検討してください。PowerShell は UTF-8 を正しく扱えます。
特殊文字がそのまま検索できない
[ ] . * など正規表現の特殊文字をリテラルとして検索したい場合は /L オプションを指定します。
literal_search.bat
:: "192.168.1.1" をリテラルとして検索(.を任意文字として扱わない)
FINDSTR /L "192.168.1.1" log.txt
パイプ経由の入力で /S が無視される
パイプ(|)でコマンドの出力を FINDSTR に渡す場合、/S は機能しません(ファイルシステムのパスがないため)。パイプ時は /S を外して使用してください。
FAQ
❓ FIND コマンドと FINDSTR の違いは何ですか? (クリックで開閉)
FIND は単純な固定文字列検索に特化しており、機能がシンプルです。一方 FINDSTR は正規表現・複数ファイル・サブフォルダ再帰など高度な検索が可能です。実務では FINDSTR の方が柔軟に使えます。FIND /C は一致した行数をカウントできる点が便利で、これは FINDSTR では直接できない機能です。
❓ 検索結果を変数に格納することはできますか? (クリックで開閉)
FOR /F を使うと FINDSTR の出力を変数に格納できます。例:
for /f "delims=" %%i in ('FINDSTR "ERROR" log.txt') do (
echo 見つかった行: %%i
)
1行ずつループ処理できます。
❓ FINDSTR で完全一致(行全体が一致)の検索はできますか? (クリックで開閉)
/X オプションを使うと行全体が検索文字列と完全に一致する行のみを返します。例えば FINDSTR /X "OK" result.txt は、”OK” だけしか書かれていない行(前後にスペースや他の文字がない行)のみに一致します。