「grep検索」を「findstr」コマンドで代用する時の注意点

「grep検索」を「findstr」コマンドで代用する時の注意点

「grep検索」便利ですね。
単純に文字列を検索しても良し、正規表現用いて高度な検索をするも良し。
サクラエディタやgpadなど多くのソフトに搭載された機能ですが、
Windowsの標準コマンドには「grep」そのものはありません。
代わりに「findstr」コマンドがあるのですが、これが厄介。
今回はこの辺りをまとめていきます。

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

「findstr」はファイルの中身から文字列を検索します。
例:findstr /n /s /p “hoge” *.*
私が使う時はこんな感じでオプションを付けがちです。
/n→行数まで表示、/s→サブフォルダも検索、/p→画像などを弾く)
オプション「/r」を付けると正規表現も使えます。
一見するとgrepと同じに見えますが、
このコマンドには大きな落とし穴があることに注意しなければいけません。

「findstr」の落とし穴

ズバリ、「Shift_JISの文字列で検索する」ということです。
つまり、「日本語文字列を検索するのは危ない」

「Shift_JIS」は文字コードの1つです。
厳密には違いますがANSIとほぼイコールで、
メモ帳から保存する時の文字コードの選択肢にもありますね。
しかし、メモ帳など多くのソフトのデフォルトは「UTF-8」です。
そして「Shift_JIS」の内容を「UTF-8」で表示しようとすると文字化けが起こります。
逆もまた然りです。
ただし文字化けが起こるのはアルファベットや数字以外の話で、
例えばひらがな、漢字、ハングル文字などです。

今回の話で問題なのは、
「UTF-8」で書かれた日本語は「findstr」で検索できないということです。
例えば、メモ帳を開いて「あいうえお」と入力して保存します。
その時、文字コードは「UTF-8」を選択します。
ここで、以下のように検索してみましょう。
 findstr /n /s /p “あいうえお” *.*
結果はヒットせずとなります。
findstrとしては、Shift_JISの「あいうえお」を探そうとしますが、
UTF-8の「あいうえお」は文字化けしたよく分からない文字列に見えているわけです。
これは単純な文字列検索の例でしたが、
検索対象に日本語が含まれているだけで正規表現もいまいち当てにならなくなります。

対策は?

一応「Shift_JIS」で保存するのを徹底していれば日本語も検索できます。
ただし、他人のPCで検索したい時やダウンロードしたものから検索したい時を考えると
あまり現実的な対策とは言えません。
頑張ってアルファベットや数字で検索するか、
大人しく便利なソフトを入れましょう

正規表現は使えませんが、エクスプローラー右上の検索も意外と優秀です。
検索タブの詳細オプションをいじるとファイルの中身まで検索できます。
(詳しい話は「エクスプローラー 検索 ファイルの中身」で検索)
エクスプローラーでの検索はかなり時間がかかるイメージでしたが、
ある程度場所を絞ってあげるとサクッと結果が出てきます。

まとめ

今回は便利そうに見えたコマンドの意外な落とし穴をご紹介しました。
また躓きがちなアレコレが見つかったらまとめようと思います。