Windowsでgrepで検索したい
Linuxユーザーならおなじみのgrepコマンド。grepコマンドは豊富かつ使いやすいオプションであることから、ファイル内のテキストを検索する際にとても重宝します。
grepコマンドを使えばバッチ・マクロを作成してファイルの検索を含む作業を自動化できるなど様々なメリットがあるので、Windowsでも同じように検索したいということがあるでしょう。
だからといってWindowsのコマンドプロンプトでファイルやフォルダを検索することができないわけではありません。grepと同じように検索できるコマンドがいくつか用意されているため、そちらで代用すればgrepコマンドと同じように検索することが可能です。
Windowsでgrepで検索する方法
Windowsでgrepコマンドと同じように検索するには、findコマンド・findstrコマンド・PowerShell(コマンドプロンプトの上位互換)で使えるSelect-Stringコマンドレットの3種類です。
それぞれ書き方や特徴・注意点が異なるので順番に解説します。
コマンドプロンプト・PowerShellの起動方法
各コマンドの説明の前に、コマンドを使用するために必要なコマンドプロンプト・PowerShellを起動しておきましょう。
findコマンド
findコマンドはコマンドプロンプトで使用できます。findコマンドはShift-JISとBOMありUTF-16のみ対応しており、文字コードがこれら以外のテキストは検索することができません。
Windowsで作成したテキストファイルの多くはShift-JISなので問題ありませんが、一部ソフトウェアや別OSで作成したファイルなど文字コードがShift-JIS・BOMありUTF-16以外のものになっている可能性があるので注意しましょう。
構文は以下の通り。
find 検索文字列 検索対象ファイル名
いくつか使用できるオプションが存在し、各オプションを組み合わせればより詳細な絞り込み検索を行えます。
- /V:検索対象文字列を含まない行をすべて表示
- /C:検索対象文字列を含む行の数だけ表示
- /N:検索で引っかかった行を表示
- /I:大文字小文字を区別せずに検索
- /OFF:オフライン属性が設定されたファイルをスキップしない
例えば、sample.txtにこんにちわ"が含まれているかどうか調べたい場合は以下のように記述します。
find こんにちわ sample.txt
このように記述することで自由に検索することが可能です。
findstrコマンド
findstrコマンドはfindコマンドを強化したコマンドです。findコマンドではただのテキストでしか検索することができませんでしたが、findstrコマンドでは正規表現を使って文字列検索できます。
正規表現を使いこなすのは少し大変ですが、慣れればとても便利ですので検索効率を上げたい場合は正規表現を見つけると良いでしょう。
こちらもfindコマンド同様Shift-JISとBOMありUTF-16にしか対応していないので注意してください。
findstrコマンドの構文は以下の通り。
findstr 検索対象文字列(正規表現) 検索対象ファイル
ただ検索するだけであればfindコマンドと大差ありません。ですが、使用できるオプションが増えています。
findstrコマンドで使用できるオプションは以下の通り。ちなみに以下のオプション説明に出てくるパターンとは正規表現のことです。
- /B:行の先頭にあるパターンを検索
- /E:行の末尾にあるパターンを検索
- /L:検索文字列リテラルとして使用
- /R:検索文字列正規表現として使用
- /S:現在のフォルダとすべてのサブフォルダから一致するファイルを検索
- /I:検索するときに大文字と小文字を区別しない
- /X:検索文字列に完全に一致する行のみ表示
- /V:検索文字列に一致しない行のみ表示
- /M:検索文字列がヒットしたらファイル名のみ表示
- /O:一致するか画像の前に文字オフセットを表示
- /P:印刷不可能な文字を含むファイルをスキップ
例えば、正規表現を使ってsample.txtから電話番号(3ケタ-4ケタ-4ケタ)のテキストを探したい場合、以下のように記述します。
findstr [0-9]{3}-[0-9]{4}-[0-9]{4} sample.txt
正規表現を知っていて初めて使いこなせるコマンドですので覚えておきましょう。
Select-Stringコマンドレット
最後はSelect-Stringコマンドレットです。こちらはコマンドプロンプトでは使用できずPowerShell専用のコマンドとなります。
構文は以下の通り
Select-String 検索対象文字列 検索対象ファイル -Encoding default
構文はほか2つと比べて複雑で覚えるのが少し大変かもしれませんが、対応している文字コードが多くなっています。
複数ファイルからの検索もしやすくなっており、フォルダ内にある全てのtxtファイルにテキスト「こんにちわ」が含まれているかどうかをチェックする場合は以下のように記述できます。
Select-String こんにちわ *.txt -Encoding default
検索方法さえ覚えれば、オプションも少なく使いやすいコマンドですのでPowerShellを使う場合はこちらがいいかもしれません。