Windowsでフォルダ内の文字列検索をしてファイルに出力する方法

特定の文字列を含むファイルを探したいとき、Unix系ではgrepを使うと実現できます。Windowsではコマンドプロンプトから「findstr」「find」が使えましたが、UTF8が利用できませんでした。PowerShellの「Select-String」を使えばUTF8のファイルを検索することができます。

PowerShellで「Select-String」(sls)を使う

使い方

PowerShellではSelect-Stringを使うと、フォルダ内のファイルから特定の文字列を持つ行を検索できます。検索テキストには正規表現が利用可能です。対象ファイルの文字コードをUTF8として、大文字と小文字の区別なく検索します。

select-string "検索テキスト" *.txt

Select-Stringは短縮形slsが利用できます。

sls "検索テキスト" *.txt

サブフォルダも含めて検索するには、dir -recurseを使います。

sls "検索テキスト" (dir -recurse *.txt)

ファイルに保存

次のようにするとリダイレクトでファイルに保存できます。ただし、出力ファイルはUTF16で、改行による整形が行われます。

sls "検索テキスト" (dir -recurse *.txt) > result.log

出力ファイルの文字コードや改行位置を変えるには、パイプでOut-Fileを利用します。UTF8は「BOMあり」になります。

sls "検索テキスト" (dir -recurse *.txt) | out-file result.log utf8 -width 9999

改行位置については次の方法でも変更できます。PowerShellのウィンドウ左上のアイコンを右クリック→プロパティ→「レイアウト」タブを開く。「画面バッファーのサイズ」にある「幅」の数値を変更します。この方法では、画面上の折り返し位置も変わります。

主なオプションなど

大文字・小文字を区別する。

sls "検索テキスト" *.txt -casesensitive

文字列の単純一致を検索する(正規表現を使用しない)。

sls "検索テキスト" *.txt -simplematch

検索に使用する文字コードを変更する。UTF7、UTF8、UTF32、ASCII、Unicode、BigEndianUnicode、Default、OEMが指定できる。

sls "検索テキスト" *.txt -encoding unicode

slsのヘルプを表示する。

get-help sls

コマンドプロンプトで「findstr」を使う

使い方

文字コードがShift_JISの場合は、コマンドプロンプトからfindstrで検索できます。既定では、大文字と小文字を区別して検索し、結果には行番号が付きません。検索テキストには一部の正規表現が利用可能ですが、単純な指定では空白を含んだ文字列は検索できません。(空白を含めると、複数のキーワードを指定したことになります)

findstr "検索テキスト" *.txt

次のようにすると、大文字と小文字を区別なく検索し、行番号をつけて表示します。

findstr /i /n "検索テキスト" *.txt

サブフォルダも含めて検索します。

findstr /s /i /n "検索テキスト" *.txt

次のようにするとリダイレクトでファイルに保存できます。

findstr /s /i /n "検索テキスト" *.txt > result.log

文字列の単純一致を検索する(正規表現を使用しない)場合は「/l」を追加します。

空白を含む場合

空白を含む場合は、/rと/cを使うと正規表現で検索できます

findstr /r /c:"検索テキスト" *.txt

次のようにすると、大文字と小文字を区別なく検索し、行番号をつけて表示します。

findstr /i /n /r /c:"検索テキスト" *.txt

サブフォルダも含めて検索します。

findstr /s /i /n /r /c:"検索テキスト" *.txt

次のようにするとリダイレクトでファイルに保存できます。

findstr /s /i /n /r /c:"検索テキスト" *.txt > result.log

文字列の単純一致を検索する(正規表現を使用しない)場合は「/r」を省略します。

そのほか

findstrのヘルプを表示します。

findstr /?

コマンドプロンプトには、機能の少ない「find」もあります。正規表現は使えません。詳細はヘルプをご覧ください。

find /?