ファイル内の文字列を正規表現で検索(FINDSTR)
FINDSTR コマンドを使用するとファイル内やコマンドの出力結果に含まれる文字列を簡易的な正規表現を使って検索することができます。ここではコマンドプロンプトにおける FINDSTR コマンドの使い方について解説します。
※ 正規表現を使用しない検索については「ファイル内の文字列を検索(FIND)」を参照されてください。
FINDSTRコマンドの使い方
FINDSTR コマンドはファイルの内容や別のコマンドの出力結果に含まれる文字列を簡易的な正規表現を使って検索します。書式は次の通りです。
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file] [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] "文字列" [[ドライブ:][パス]ファイル名[...]]
ファイルに含まれる文字列を検索する場合の基本書式は次の通りです。
FINDSTR "検索する文字列" ファイル名
検索する文字列はダブルクォーテーションで囲んで指定してください。(FIND コマンドと異なり FINDSTR コマンドではダブルクォーテーションで囲わなくてもエラーとはなりません)。
FINDSTR コマンドで用意されているオプションの意味は次の通りです。
/B 行の先頭にある場合にそのパターンと一致します。
/E 行の末尾にある場合にそのパターンと一致します。
/L 検索文字列をリテラルとして使用します。
/R 検索文字列を正規表現として使用します。
/S 現在のディレクトリとすべてのサブディレクトリから一致するファイルを検索します。
/I 検索するときに大文字と小文字を区別しません。
/X 完全に一致する行を出力します。
/V 一致を含まない行のみを出力します。
/N 一致する各行の前に行番号を出力します。
/M ファイルに一致が含まれる場合、そのファイル名のみを出力します。
/O 一致する各行の前に文字オフセットを出力します。
/P 印刷不可能な文字を含むファイルをスキップします。
/OFF[LINE] オフライン属性が設定されたファイルをスキップしません。
/A:attr 2 桁の 16 進数で色属性を指定します。"color /?" を参照してくだ さい。
/F:file 指定したファイルからファイル一覧を読み取ります (/ はコンソールを指します)。
/C:string 指定された文字列をリテラル検索文字列として使用します。
/G:file 指定されたファイルから検索文字列を取得します (/ はコンソールを指します)。
/D:dir セミコロンで区切られたディレクトリの一覧を検索します。
/Q:qflags Quiet モード フラグ:
u サポートされない Unicode 形式に関する警告を抑制します
また FINDSTR コマンドでは簡易的な正規表現が利用可能です。
. ワイルドカード: 任意の文字 * 繰り返し: 直前の文字またはクラスのゼロ回以上の出現 ^ 行位置: 行頭 $ 行位置: 行末 [class] 文字クラス: セット内の任意の 1 文字 [^class] 逆クラス: セットにない任意の 1 文字 [x-y] 範囲: 指定した範囲の任意の文字 \x エスケープ: メタ文字 x のリテラル使用 \<xyz 単語位置: 単語の先頭 xyz\> 単語位置: 単語の終わり
それぞれ確認していきます。
ファイルの内容を検索する
今回次のようなファイル pref.txt を用意しました。
カレントディレクトリにある pref.txt ファイルの中で文字列 "京" が含まれる行を表示するには次のように実行します。
findstr "京" pref.txt
「/V」オプション
指定した文字列が含まれない行の一覧を取得するには「/V」オプションを使用します。例えばカレントディレクトリにある pref.txt ファイルの中で文字列 "県" が含まれない行を表示するには次のように実行します。
findstr /v "県" pref.txt
「/N」オプション
FIND コマンドを使用するときに、検索文字列が含まれる行が表示される時に行番号をつけて表示するには「/N」オプションを使用します。例えばカレントディレクトリにある pref.txt ファイルの中で文字列 "山" が含まれる行を行番号を付けて表示するには次のように実行します。
findstr /n "山" pref.txt
「/O」オプション
検索文字列が含まれる行が見つかったときにオフセットを表示するには「/O」オプションを使用します。例えばカレントディレクトリにある pref.txt ファイルの中で文字列 "山" が含まれる行をオフセットを付けて表示するには次のように実行します。
findstr /o "山" pref.txt
※ ここでのオフセットとは、ファイルの先頭から検索文字列が見つかった位置までのバイト数のことです。
パイプを使って他のコマンドの実行結果を検索する
例えば TYPE コマンドを使ってカレントディレクトリにある pref.txt ファイルの内容を出力してみます。
type pref.txt
FINDSTR コマンドを使用することで、他のコマンドを実行した時の実行結果の中に指定した検索文字列が含まれるものだけを表示することができます。例えば先ほどの TYPE コマンドの実行結果の中で文字列 "島" が含まれる行を表示するには次のように実行します。
type pref.txt | findstr "島"
複数のファイルを対象に検索する
FINDSTR コマンドでは複数のファイルを対象に検索を行うことができます。複数のファイルを対象にする場合は次のように記述してください。
FINDSTR "検索する文字列" ファイル名1 ファイル名2 ...
今回次のようなファイル pref1.txt と pref2.txt を用意しました。
カレントディレクトリにある pref1.txt と pref2.txt ファイルの中で文字列 "山" が含まれる行を表示するには次のように実行します。
findstr "山" pref1.txt pref2.txt
拡張子が .txt のファイルをすべて対象とするような場合は、一つ一つファイル名を指定する代わりに *.txt のように指定できます。
findstr "山" *.txt
「/S」オプション
検索を行うときに「/S」オプションを付けることで現在のディレクトリとすべてのサブディレクトリから一致するファイルを検索することができます。下記の例ではカレントディレクトリに pref1.txt と pref2.txt、 サブディレクトの back ディレクトリの中に pref_all.txt がある状態で検索を行いました。
findstr /S "山" *.txt
カレントディレクトリだけでなく、サブディレクトリにあるファイルも対象として検索文字列と一致するかどうか検索しました。
正規表現を使って検索する
FINDSTR コマンドでは、検索する文字列のところで簡易的な正規表現を使用することができます。利用可能な正規表現のメタ文字は次の通りです。
. ワイルドカード: 任意の文字 * 繰り返し: 直前の文字またはクラスのゼロ回以上の出現 ^ 行位置: 行頭 $ 行位置: 行末 [class] 文字クラス: セット内の任意の 1 文字 [^class] 逆クラス: セットにない任意の 1 文字 [x-y] 範囲: 指定した範囲の任意の文字 \x エスケープ: メタ文字 x のリテラル使用 \<xyz 単語位置: 単語の先頭 xyz\> 単語位置: 単語の終わり
※ 正規表現について詳しくは「正規表現入門」を参照されてください。
検索文字列として入力した値を正規表現として扱う場合には「/R」オプションを付けてください。(正規表現ではなく通常のリテラルとして扱う場合は「/L」を付けてください)。例えば文字列の先頭に "山" がある文字列を検索する場合には、行頭を表すメタ文字である ^ を使って次のように記述します。
findstr /R "^山" pref.txt
文字列の先頭に "山" がある文字列だけを検索することができました。
複数の検索文字列を一緒に検索する
「/R」オプションを指定している場合、複数の検索文字列をまとめて検索することができます。複数検索文字列を検索する場合は次のように記述してください。
FINDSTR /R "検索文字列1 検索文字列2 ..." ファイル名
複数の検索文字列をスペースで区切って記述してください。いずれかの検索文字列が含まれる文字列を検索します。
例えば "山" または "島" が含まれる文字列を検索するには次のように記述します。
findstr /R "山 島" pref.txt
-- --
FINDSTR コマンドを使ってファイル内やコマンドの出力結果に含まれる文字列を検索する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。