findstr コマンドの便利なオプションに関して説明します。主にコマンドプロンプトやバッチファイルで使用しますが、覚えておくと作業効率がとてもよくなるオプションが多数あるため、是非マスターしてください。
スポンサーリンク
ファイルから文字を検索する。複数ファイルや再帰的なサブフォルダも可能。
正規表現の"一部の機能"も使用可能。正規表現の基本機能のみ使用可能でありほとんどの機能はサポートしていない。
一致する部分のみではなく、一致する行すべて出力される。
Unix 系 の grep なみの機能を Windowsで使いたいなら、cgywin などをインストールして使う。あるいはVBScriptやpowershellでMS仕様のさらに高度な正規表現が使える。
2017年現在では、検索可能な文字コードはShift-JIS(メモ帳ではAnsi)。他のコードの場合は正しく検索されない場合が多い。
スポンサーリンク
基本は"検索する文字列" と "検索対象のファイル"を順番に指定します。
findstr <検索文字列> <対象ファイル>
findstr abc 検索対象.txt
(*)デフォルトでは検索対象は固定の文字列(リテラル)として扱われる。これは/C:オプションと同じ。
正規表現として指定するなら /R オプションを使用する。
対象ファイルにワイルドカードを指定して一気の検索も可能
findstr aaa *
findstr aaa c:\temp\*
findstr の結果「見つかった」「見つからない」「文法エラー」は%ERRORLEVEL%でチェック可能。
見つかった場合は 0
C:\>findstr "zzz" 検索対象.txt
zzz
C:\temp>echo %ERRORLEVEL%
0
見つからない場合は 1
C:\>findstr /z
FINDSTR: /z は無視されました。
FINDSTR: コマンド ラインが正しくありません
C:\>echo %ERRORLEVEL%
2
移行はバッチファイルで判定するサンプルプログラム。
@echo off
findstr /DD xaaa 検索対象.txt
if %ERRORLEVEL% == 0 echo 見つかりました
if %ERRORLEVEL% == 1 echo 見つかりません
if %ERRORLEVEL% == 2 echo コマンドラインの文法エラー
スポンサーリンク
systeminfo の出力をパイプで受け取り、BIOSで検索する。
systeminfo | findstr BIOS
findstr /I abc 検索対象.txt
ABc
abC
findstr /C:"abc def" 検索対象.txt
/C オプションを指定しないでスペースを入れると、複数ワードの検索として解釈される。
/Cの後にコロンが必要な点に注意。"FINDSTR: /C は無視されました。"とエラー出力される場合はコロンを忘れている。
行の先頭の abc とマッチ。
findstr -R "^abc" 検索対象.txt
行の最後の abc とマッチ。
findstr -R "abc$" 検索対象.txt
findstr /R "[abc]." 検索対象.txt
ちょっと特殊。相反する /R と /C のオプションを指定する。
findstr /R /C:"[0-9]. [0-9]." 検索対象.txt
123 4567
などがヒットする
結果に行番号を出力する。要するに検索対象.txt 内での行数。
findstr /N abc 検索対象.txt
1: abc def
6: abc1
/Sで現在のフォルダのサブフォルダも再帰的に検索する
findstr /S "aaa" 検索対象.txt
\ によりエスケープを行う。(参考までコマンドプロンプトでのエスケープは ^ なので注意)
\[
\]
\.
\*
\^
\$
\-
/S で一括で検索する場合は、exeなどバイナリファイルまで対象となり出力が崩れる。
/Pオプションを指定すると、バイナリファイルは除外される。(ヘルプでは「印刷不可能な文字を含むファイルをスキップ」と呼んでいる)
findstr /S /P abc *
/Dオプションを指定し、複数フォルダをセミコロンで指定する。aaaを で検索
findstr /D:c:\temp;c:\temp2 aaa *
さらに/Sで再帰的にサブフォルダも検索
findstr /S /D:c:\temp;c:\temp2 aaa *
完全に一致する行のみ
findstr /X aaa 検索対象.txt
多分以下と同じ
findstr /X /R "^aaa$" 検索対象.txt
findstr /V aaa 検索対象.txt
スペースを含むと or となる。スペースそのものを検索したい場合は/C:"<検索文字>"
aaa あるいはabcで検索
findstr "aaa abc" 検索対象.txt
/G
/F
単語の先頭が aaa で始まるもの。
findstr /R "\<aaa" 検索対象.txt
単語がxyz で終わるもの
findstr /R "xyz\>" 検索対象.txt
文字コードがUTF-16(メモ帳ではUnicode)あるいはUTF-8の場合は検索できないようだ。
Shift-JIS(メモ帳ではAnsi)で保存すると検索できるようになる。
UTF-16、UFT-8の場合、英語の検索でも間違った結果が帰る場合がある。(マルチバイトの文字を誤判断)
findstrを使用する場合はShift-JISが無難。
c:\temp\検索文字一覧.txtに記載された文字(文字ごとに改行しておく)をそれぞれループして検索。
要するに3行あれば3回ループする。
for /F %%i in (c:\temp\検索文字一覧.txt) do (
findstr /C:%%i /S *.txt
)
findstr /R "[a-z]*" c:\temp\*
だと[a-z]ではない 111などの数字もヒットする。
これは * が 0 個以上の数字だから。
他のエディタなどのプロセスが開いていると"開くことができません "で失敗する。もちろんそのファイルが存在しない場合も。
・標準出力
findstr aaa 検索対象.txt > stdout.txt
・エラー出力
findstr aaa 検索対象.txt 2> stderr.txt
・両方を異なるファイル
findstr /Z aaa 検索対象.txt > stdout.txt 2> stderr.txt
・両方を同じにファイル
findstr aaa 検索対象.txt > stdout-stderr.txt 2>&1