Linuxではログ解析やファイル検索で grep を頻繁に利用します。しかし、WindowsのPowerShellには grep コマンドが標準搭載されていません。その代わりに、PowerShellには強力な検索コマンドレット Select-String が用意されています。Microsoftの公式ドキュメントでも、文字列検索やログ解析には Select-String の利用が推奨されています。
本記事では、PowerShellで grep のような検索を行う方法を紹介します。
Select-Stringの基本
Linuxのgrepに相当するコマンドです。sample.log ファイルから ERROR という文字列を grep します。
PS> Select-String -Path "sample.log" -Pattern "ERROR"
sample.log:25:ERROR Database connection failed.
パラメータは以下の通りです。
| パラメータ | 説明 |
| Path | 検索対象ファイル |
| Pattern | 検索する文字列 |
複数ファイルを一括検索する
ワイルドカードを利用して複数のログファイルを検索することもできます。
PS> Select-String -Path "*.log" -Pattern "ERROR"
大量のログファイルから特定のエラーメッセージを探したい場合に便利です。
大文字・小文字を区別する
PowerShellは既定では大文字・小文字を区別しません。
例えば次の検索では、
- ERROR
- Error
- error
のすべてがヒットします。
PS> Select-String -Path "sample.log" -Pattern "error"
大文字・小文字を区別する場合は -CaseSensitive を指定します。
Select-String -Path "sample.log" -Pattern "ERROR" -CaseSensitive
複数のキーワードを検索する
複数の条件を指定することも可能です。
PS> Select-String -Path "*.log" -Pattern "ERROR","WARNING"
app.log:10:ERROR Application Error
app.log:50:WARNING Memory Usage High
障害調査時によく利用する方法です。
特定のフォルダ配下を再帰検索する
サブフォルダも含めて検索したい場合は Get-ChildItem と組み合わせます。
Get-ChildItem -Path C:\Logs -Recurse -Filter *.log | Select-String -Pattern "ERROR"
フォルダ配下にあるすべてのログファイルが検索対象になります。
正規表現を利用する
Select-String は正規表現に対応しています。
例として IPアドレスを検索します。
PS> Select-String -Path "*.log" -Pattern "\d+\.\d+\.\d+\.\d+"
server.log:54:Client IP=192.168.1.10
なお、正規表現の一覧はこちらにまとめています。
検索結果をファイルへ出力する
検索結果をテキストファイルとして保存することもできます。
Select-String -Path "*.log" -Pattern "ERROR" | Out-File "result.txt"
障害調査報告書やエビデンス取得時によく利用されます。

コメント