PowerShellでテキストファイルの内容を検索する方法

PowerShellでテキストファイルの内容を検索する方法

Windows環境で、コマンド操作でテキストファイルの内容を検索したい場合、Windowsコマンドなら「fidstr」、PowerShellコマンドレットなら「select-string」が利用できます。

ですが、findstrコマンドは文字コードとしてS-JISにしか対応しておらず、最近利用することが多くなったUTF8などのテキストデータを検索する場合にはPowerShellのSelect-Stringコマンドレットの方が便利です。

そこでここでは、Windows 10を例にSelect-Stringコマンドレットを使って、テキストファイルの内容を検索する方法を紹介します。

Select-Stringコマンドレットの使い方

Select-Stringコマンドレットの基本的な書式は次のとおりです。

PS> Select-String -Pattern <検索パターン> -Path <検索対象>

以降では、一般的な使用例をいくつか紹介します。

指定した文字列を含むファイルを検索する

たとえば「E:\Test」フォルダー内から「abc」という文字列を含むファイルを検索したい場合は、次のようにコマンドを実行します。

PS> Select-String -Pattern abc -Path E:\Test\*.*

コマンドの実行結果には、該当するファイル名、行番号、該当行の文字列が表示されます。

PowerShellでテキストファイルの内容を検索する方法

特定の拡張子のファイルを対象に検索する

拡張子が「.txt」のファイルのみを検索対象にしたい場合は、以下のようにコマンドを実行します。

PS> Select-String E:\Test\*.txt -Pattern abc

文字コードをシフトJISで検索する

検索パターンにシフトJISの日本語が含まれている場合は「-Encoding」オプションで「oem」を指定する必要があります。

PowerShellでテキストファイルの内容を検索する方法

出力をコンパクトに表示する

Select-Stringコマンドレットの出力には、デフォルトで該当するファイル名、行番号、該当行の文字列が表示されますが、該当行の文字列が長い場合などでは、結果が見づらくなる時があります。

そのようなときは、Select-Objectコマンドレットを組み合わせることで、ファイル名だけや、ファイルのフルパスだけ表示させることができます。

PS > Select-String -Pattern abc -Path E:\Test\*.* | Select-Object Filename
PS > Select-String -Pattern abc -Path E:\Test\*.* | Select-Object Path

PowerShellでテキストファイルの内容を検索する方法

サブフォルダーを含めて検索する

Select-Stringコマンドレットは、デフォルトで指定したフォルダー内しか検索できませんが、Get-ChildItemコマンドレットと組み合わせることで、サブフォルダーのファイルを含めて検索できます。

たとえば「E:\Test」フォルダーとサブフォルダー内の拡張子が「.txt」のファイルから「abc」というテキストを含むファイルを検索したい場合は、次のようにコマンドを実行します。

PS> Get-ChildItem E:\Test\ -Recurse -Filter *.txt | Select-String -Pattern abc

PowerShellでテキストファイルの内容を検索する方法

指定した文字列を含まないファイルを検索する

Select-Stringコマンドレットでは「-NotMatch」オプションを使用することで、指定した文字列を含まないファイルを検索することもできます。

たとえば「E:\Test」フォルダー内から「abc」という文字列を含まないファイルを検索したい場合は、次のようにコマンドを実行します。

PS> Select-String E:\Test\*.* -Pattern abc -NotMatch

PowerShellでテキストファイルの内容を検索する方法

大文字と小文字を区別して検索する

Select-Stringコマンドレットでは、デフォルトで既定では「-Pattern」オプションで指定する文字列の大文字と小文字は区別されませんが「-CaseSensitive」オプションを付けることで大文字と小文字を区別できます。

たとえば、以下のように実行すると、アルファベットの小文字で「abc」という文字列を含むファイルだけを検索できます。

PS> Select-String E:\Test\*.* -Pattern abc -CaseSensitive

あとがき

テキストファイルなどから特定の文字列を検索したい場合、メモ帳などのテキストエディターで開いてから、メモ帳の検索機能を使うという方法もありますが、コマンド操作に慣れているなら、上で紹介したSlect-Stringコマンドレットを使うことで、より効率よく検索できる場合が多々あるでしょう。

なお、Slect-Stringコマンドレットのより詳しい使い方を知りたい場合は、公式サイトのページが役立つでしょう。ご活用あれ。

Select-String (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Docs