ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

Windows標準のコマンドでテキストを検索したい!②

今回は、「Windows標準のコマンドでテキストを検索したい②」と題した記事を書いていこうと思います。
関連する過去の記事は以下です。ご興味があれば、お読みいただけると嬉しいです。
Windows標準のコマンドでテキストを検索したい! - ITエンジニアの成長ブログ
Windows標準のコマンドでテキストを検索したい!~番外編~ - ITエンジニアの成長ブログ

過去の記事では、Windows標準でテキストを検索するためのコマンドである"find"コマンドを紹介していきました。
今回は、そのfindコマンドと同じようにWindows標準でテキストファイルを検索でき且つ、findコマンドよりも便利な"findstr"というコマンドを紹介したいと思います。

findstrコマンドの使い方

findstrコマンドの書式は、以下の通りです。

書式:findstr [オプション] "文字列" 検索するファイルパス

第一引数に検索したい文字列を、第二引数にその文字列を検索したいファイル名を指定します。また、オプションも豊富に用意されているので検索したい条件や内容によって指定できます。ここまでは、findコマンドと全く同じですね。
この例だけではもちろん便利であることがわからないと思いますので、今回も前回のfindコマンドと同様にいくつか、よく使いそうなオプションなどを紹介していきたいと思います!

また、これから使用するサンプルテキストは以下の通りです。
・test.log

INFO  [2020-08-31 18:40] A is completed.END
INFO  [2020-08-31 18:41] B is completed.END.No ERROR.
ERROR [2020-08-31 18:42] A is exception.END
INFO  [2020-08-31 18:43] D is completed.END

行の先頭が特定の文字列である行を検索したい

書式:findstr /B "文字列" 検索するファイルパス

オプション「/B」は、行の先頭に特定の文字列がある行のみ検索するためのオプションです。これを使えば、たとえばログフォーマットの先頭に"INFO"や"ERROR"などのログレベルを出力している場合に、簡単に対象行を検索することができます。

>findstr /B "ERROR" test.log
ERROR [2020-08-31 18:42] A is exception.END

test.logの2行目にも検索する文字列"ERROR"が含まれていますが、今回の検索対象にはなっていません。想定通り、行の先頭が該当の文字列で一致する行のみ検索できていることが確認できます。

行の末尾が特定の文字列である行を検索したい

書式:findstr /E "文字列" 検索するファイルパス

オプション「/E」は、前方一致ではなく後方一致を意味します。行の末尾に特定の文字列がある行のみ検索するためのオプションです。

>findstr /E "END" test.log
INFO  [2020-08-31 18:40] A is completed.END
ERROR [2020-08-31 18:42] A is exception.END
INFO  [2020-08-31 18:43] D is completed.END

こちらも特定説明の必要はないと思いますが、末尾が"END"の文字列のみを取得しています。2行目は末尾に該当文字列が存在しないため、検索されません。

文字列の大文字小文字を区別せずに検索したい

書式:findstr /I "文字列" 検索するファイルパス

オプション「/I」は、検索する文字列を大文字小文字区別せずに検索したい場合に使用します。デフォルトでは、大文字小文字が区別されるので
たとえば"info"を指定してオプションなしで検索した場合は何も検索されません。

>findstr "info" test.log
※何も検索なし

しかし、「/I」オプションを付与することで以下の通り検索結果が変わります。指定した文字列"info"の大文字の文字列"INFO"が含まれる行が検索されていることが確認できると思います。

>findstr /I "info" test.log
INFO  [2020-08-31 18:40] A is completed.END
INFO  [2020-08-31 18:41] B is completed.END.No ERROR.
INFO  [2020-08-31 18:43] D is completed.END

通常であれば、厳密に大文字小文字を意識して検索したいケースは少ないと思うのでこのオプションはいつも付与しておくのが良いと思います。

指定した文字列に一致しない行を検索したい

書式:findstr /V "文字列" 検索するファイルパス

オプション「/V」は、引数に指定した文字列が存在しない行を検索できます。通常の検索とは逆の発想ですね。

>findstr /V "INFO" test.log
ERROR [2020-08-31 18:42] A is exception.END

使用例としては、上記のように"INFO"が含まれる行は正常処理だから問題ないと考えて、その他の”ERROR"または"WARN"など異常が発生しているかもしれないログを抽出する際に便利です。

一致したテキストの各行の前に行番号を表示したい

書式:findstr /N "文字列" 検索するファイルパス

オプション「/N」は、一致したテキストの検索結果の各行の前にファイルの行番号を表示することができます。

>findstr /N "INFO" test.log
1:INFO  [2020-08-31 18:40] A is completed.END
2:INFO  [2020-08-31 18:41] B is completed.END.No ERROR.
4:INFO  [2020-08-31 18:43] D is completed.END

検索したファイルの中の行番号は、通常であれば知りたい情報だと思いますのでこのオプションはいつも付与しておくのが良いと思います。

複数の文字列をOR条件で検索したい

書式:findstr "文字列1 文字列2" 検索するファイルパス

この使用例は、オプションはとくに不要です。複数の文字列をOR条件で検索したい場合はダブルクォーテーションに半角スペース区切りで、検索したい文字列を指定します。

>findstr "18:40 18:43" test.log
INFO  [2020-08-31 18:40] A is completed.END
INFO  [2020-08-31 18:43] D is completed.END

OR条件で検索する文字列の数は、上記例では2個ですがそれ以上あっても問題なく検索できます(ちょっと上限はわかりません・・・)。

おわりに

いかがでしたでしょうか。ちなみに、いくつかオプションを紹介させていただきましたが、これらのオプションは同時に指定することも可能です。
また、他にも使用可能なオプションはたくさんあるので是非お手元のPCで色々と試してみてください。

そして、記事を書いた後に気づきましたが今回の"findstr"コマンドのオプションの説明は、前回記事の"find"コマンドとほぼ同じでした・・・
本当は"find"コマンドにない機能を紹介しようとしていたのですが、よく使う機能はどちらでも使用可能ということでしょうか。
結論としては、基本的に"findstr"コマンドを使えば良いと思います。"find"コマンドにない、正規表現での検索も可能なので。

最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。