コマンドレット説明書【Select-String】の使い方 (PowerShell v5.1)

こんにちは。チェシャ男です。(-皿-)

今回は、Select-String について概要から使用例について簡単にご紹介します。

コマンドレットリファレンス」カテゴリの記事では省略している情報を参照したい場合に本記事をご覧ください。

はじめに

本記事は英語のリファレンス情報しかないコマンドレットについて「Get-Help」等の情報を参考に検証した結果を掲載しています。公式見解ではないことにご注意ください。

正式なヘルプを参照したい場合は、「Get-help Select-String -online」を実行し公式ヘルプをご覧ください。

また、本記事内の例は動作を確認していますが、動作を確約しているわけではありません。

Select-String の概要

Select-String は文字列やファイル内のテキストから任意のパターンを検索します。

基本構文

#パターン①
Select-String [-Pattern] <String[]> [-Path] <String[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <String>] [-Exclude <String[]>] [-Include <String[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] [<CommonParameters>]

#パターン②
Select-String [-Pattern] <String[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <String>] [-Exclude <String[]>] [-Include <String[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] -InputObject <PSObject> [<CommonParameters>]

#パターン③
Select-String [-Pattern] <String[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <String>] [-Exclude <String[]>] [-Include <String[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] -LiteralPath <String[]> [<CommonParameters>]

[]で囲まれたパラメーターは任意のオプションです。
{}で囲まれた箇所は要素を選択してください。
<>で囲まれた箇所はオブジェクトの型名を示しています。

動作の説明

Select-String は、入力文字列やファイル内のテキストから任意の文字列パターンを検索します。UNIX での「Grep」および Windows での「Findstr」のように使用することができます。

Select-String はエイリアスとして「SLS」を使用することができます。

既定では各行で最初の一致を検索し、一致する度に

ファイル名」:「行番号」:「一致を含む行内のすべてのテキスト

を表示します。

行内に複数の一致があった場合は、一致の前後のテキストを表示するか、一致が検出されたかどうかを示す bool 値(true または false)のみを表示するように指定することができます。

また、すべてのテキストの一致を表示することや各入力ファイル内の最初の一致の後に停止することもできます。指定したパターンに一致しないすべてのテキストを表示することもできます。

Unicode テキストファイルを検索する場合などは、Select-String が特定の文字エンコーディングに合わせて動作するように指定することができます。

各パラメータについて

-AllMatches [<SwitchParameter>]

各行で2つ以上の一致を検索します。このオプションを指定しないと各テキスト行で最初の一致のみを検索します

-CaseSensitive [<SwitchParameter>]

照合で大文字と小文字を区別します。既定では、照合時に大文字と小文字は区別されません。

-Context <Int32[]>

一致した行の前後の行を指定された行数で表示します。これによりコンテキスト(前後の文脈)で一致を表示することができます。

このオプションの値として数値を1つ設定すると、その数値が一致した行の前後で表示される行数となります。値として数値を2つ設定すると、最初の数値が一致の前の行数となり、2番目の数値が一致の後の行数となります。

既定の表示方法では、一致した行に右山かっこ“>”が表示されます。マークが表示されていない行はコンテキストです。

コンテキストにも一致が含まれている場合、各一致を表す MatchInfo オブジェクトにはすべてのコンテキスト行が含まれますが、重複する一致行は1回だけ表示されます。

Select-String の出力を再び Select-String にパイプするとき、受信側の Select-String はコンテキスト行内のテキストは検索せず、一致した行内のテキスト(MatchInfo オブジェクトの Line プロパティの値)のみを検索します。

そのため、Context オプションは受信側の Select-String では無効です。

-Encoding <String>

ファイルを検索するときに、Select-String が使用する文字エンコードを指定します。既定値は「UTF-8」です。

設定可能な有効値
UTF7 , UTF8 , UTF32 , ASCII , Unicode , BigEndianUnicode , Default , OEM

“Default”は、システムの現在の ANSI コードページのエンコードです。”OEM” は、オペレーティングシステムの現在の OEM (Original Equipment Manufacturer) コードページ識別子です。

-Exclude <String[]>

指定された項目を除外します。このオプションの値は”-Path”オプションの補足として使用します。「*.txt」のようにワイルドカードを使用してパス要素またはパターンを設定できます。

-Include <String[]>

指定した項目だけを含めます。このオプションの値は”-Path”オプションの補足として使用します。「*.txt」のようにワイルドカードを使用してパス要素またはパターンを設定できます。

-InputObject <PSObject>

検索するテキスト(オブジェクト)を指定します。テキストが格納されている変数を設定するか、結果を取得するコマンドレットまたは式(関数等)を設定します。

InputObject オプションを使用する場合は、文字列を Select-String にパイプ処理する場合と以下のように異なります。

■Select-String に2つ以上の文字列(コレクション)をパイプ処理する時…

Select-String は各文字列について指定されたテキストを検索し、検索テキストを含む各文字列を返します。

■InputObjectオプションを使用して、文字列(コレクション)を送信する時…

Select-String は1つの結合された文字列としてコレクションを処理し、任意の文字列で検索テキストが見つかった場合は、1つのユニットとして文字列を返します。

-List [<SwitchParameter>]

入力ファイルごとに最初の一致のみを返します。既定では、Select-String は一致が見つかる度に MatchInfo オブジェクトを返します。

-NotMatch [<SwitchParameter>]

指定したパターンに一致しないテキストを検索します。

-Path <String[]>

検索するファイルへのパスを指定します。ワイルドカードを使用できます。

“Log1.txt”や”* .doc”、”*. *” などで、ディレクトリ内のファイルを指定します。ディレクトリのみを指定するとコマンドレットは失敗します。

-Pattern <String[]>

検索するテキストを指定します。文字列または正規表現を入力します。文字列を入力する場合は、SimpleMatch オプションを使用します。

-Quiet [<SwitchParameter>]

MatchInfo オブジェクトの代わりに bool 値( true または false )を返します。パターンが見つかった場合、値は「true」でそれ以外の場合、値は「false」です。

SimpleMatch [<SwitchParameter>]

正規表現照合ではなく単純な照合を使用します。単純な照合では、”-Pattern”オプション内のテキスト用の入力を検索します。

-LiteralPath <String[]>

検索するファイルへのパスを指定します。Path と異なり、LiteralPath オプションの値は入力したとおりに使用されます。ワイルドカードとして解釈される文字はありません。パスにエスケープ文字が含まれている場合は、単一引用符で囲んで使用します。

<CommonParameters>

このコマンドレットでは、

Verbose、Debug、ErrorAction、ErrorVariable、WarningAction、WarningVariable、OutBuffer、PipelineVariable、OutVariable

の各共通パラメーターを使用することができます。

入力値

System.Management.Automation.PSObject

(ToString メソッドを伴う任意のオブジェクトを Select-String へパイプ処理することができます。)

出力値

Microsoft.PowerShell.Commands.MatchInfo
System.Boolean

(既定では一致するごとに1つずつの MatchInfo オブジェクトを出力します。Quiet オプションを使用した場合、出力はパターンが見つかったかどうかを示す Bool値です。)

備考

Select-String は UNIX の Grep コマンドおよび Windows の FindStr コマンドに似ています。エイリアスの “sls” は、PowerShell 3.0 で導入されました。

Select-String では、検索する対象のテキストファイルオブジェクト入力値として使用します。検索する対象は以下のいずれかの方法で指定します。

  • 引用符で囲まれた文字列内のテキストを入力し、Select-String にパイプ処理します。
  • テキスト文字列を変数に格納し、InputObject オプションの値として、変数を指定します。
  • テキストがファイルに格納されている場合は、Path オプションを使用して、ファイルへのパスを指定します。

Select-String の既定の出力は、MatchInfo オブジェクトで、一致に関する詳細な情報が含まれています。MatchInfo のオブジェクトには FilenameLine などのプロパティが含まれるため、オブジェクト内の情報は、ファイル内のテキストを検索するときに役立ちます。
※入力がファイルから取得したものでない場合、これらのオプションの値は “InputStream” になります

MatchInfo オブジェクト内の情報が必要ない場合は、Quiet オプションを使用します。このオプションは、MatchInfo オブジェクトではなく、一致が見つかったかどうかを示す bool 値 (true または false) を返します。

Select-String は、語句の照合時にシステムに設定されている現在のカルチャを使用します。現在のカルチャを検索するには、Get-Culture コマンドレットを使用します。

使用例

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

PS C:\> "Hello","HELLO" | Select-String -Pattern "HELLO" -CaseSensitive

HELLO

この例では、Select-String コマンドにパイプされたテキストの大文字と小文字を区別した照合を実行します。

その結果、”Hello” は一致しないため、Select-String は “HELLO” のみを検索します。

CaseSensitive オプションがない場合、引用符で囲まれた文字列はそれぞれ 1 行として扱われるため、Select-String は両方の文字列を一致として認識します。

例2:条件に一致したファイル内を検索する

PS C:\> Get-Item -Path *.xml


    ディレクトリ: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2017/03/08      3:48             38 test.xml

PS C:\> Select-String -Path *.xml -Pattern "the the"

test.xml:1:the the
test.xml:3:the the

この例では、現在のディレクトリ内の .xml ファイル名拡張子を持つすべてのファイルを検索し、それらのファイル内の文字列 “the the” を含む行を表示します。。

例3:自動変数を使用してパスを指定する

PS C:\> Get-Item $pshome\ja-JP\*.txt


    ディレクトリ: C:\Windows\System32\WindowsPowerShell\v1.0\ja-JP


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/09/12     20:28           5391 default.help.txt


PS C:\> Select-String -Path $pshome\ja-JP\*.txt -Pattern "Help"

Windows\System32\WindowsPowerShell\v1.0\ja-JP\default.help.txt:15:    参照できます。また、Update-Help コマンドレットを使用してヘルプ ファイル
を
Windows\System32\WindowsPowerShell\v1.0\ja-JP\default.help.txt:16:    コンピューターにダウンロードし、Get-Help コマンドレットを使用してコマン
ド ラインで
Windows\System32\WindowsPowerShell\v1.0\ja-JP\default.help.txt:19:    Update-Help コマンドレットを使用すると、更新されたヘルプ ファイルをリリ
ース時に
Windows\System32\WindowsPowerShell\v1.0\ja-JP\default.help.txt:22:    ヘルプ ファイルがない場合は、Get-Help を実行すると、コマンドレット、関数
、
Windows\System32\WindowsPowerShell\v1.0\ja-JP\default.help.txt:32:        Get-Help <コマンドレット名> -Online
Windows\System32\WindowsPowerShell\v1.0\ja-JP\default.help.txt:34:  UPDATE-HELP
Windows\System32\WindowsPowerShell\v1.0\ja-JP\default.help.txt:40:          Update-Help

...以下略

この例では、PowerShell の概念的なヘルプファイルで”Help”を含む情報を検索します。

この例ではパスを指定するために $pshome 自動変数の値を使用しています。この変数は PowerShell のインストールディレクトリへのパス情報を格納します。

例4:イベントログのメッセージを検索する

PS C:\> $events = Get-EventLog -LogName application -Newest 100
PS C:\> $events | Select-String -InputObject {$_.message} -pattern "不可"
障害バケット 、種類 0
イベント名: WindowsUpdateFailure3
応答: 使用不可
Cab ID: 0

添付ファイル:

これらのファイルは次の場所にある可能性があります:
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\NonCritical_10.0.14393.0_458e83e2045a44cc77f8b618e9626471b6e87_00000000_214451ec

分析記号:
解決策を再確認中: 0
レポート ID: a3a45e47-0355-11e7-9777-005056000a07
レポートの状態: 2
ハッシュされたバケット:
障害バケット 、種類 0
イベント名: WindowsUpdateFailure3
応答: 使用不可
Cab ID: 0

添付ファイル:

これらのファイルは次の場所にある可能性があります:
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\NonCritical_10.0.14393.0_458e83e2045a44cc77f8b618e9626471b6e87_00000000_20c5304d

分析記号:
解決策を再確認中: 0
レポート ID: 8d12862d-0354-11e7-9777-005056000a07
レポートの状態: 2
ハッシュされたバケット:
障害バケット 、種類 0
イベント名: WindowsUpdateFailure3
応答: 使用不可
Cab ID: 0

この例では、イベント ビューアーのアプリケーション ログにおける 100 個の最新のイベントで、文字列 “不可” を検索します。

最初のコマンドは、Get-EventLog コマンドレットを使用して、アプリケーション イベント ログから、100 個の最新のイベントを取得します。その後、イベントを $events 変数に格納します。

2 番目のコマンドは、パイプライン演算子 (|) を使用して $events 変数内のオブジェクトを Select-String に渡します。$events 変数からの入力を表すために、InputObject オプションを使用します。InputObject オプションの値は、パイプラインを介してやり取りする際の、各オブジェクトの Message プロパティです。

例5:複数ファイルをまとめて検索する

PS C:\>PS C:\> Get-ChildItem C:\windows\system32\*.txt -Recurse | Select-String -Pattern "Microsoft" -CaseSensitive


windows\system32\catroot2\dberr.txt:1:CatalogDB: 4:55:38 AM 9/12/2016: SyncDB:: A
utoMerged-com~31bf3856ad364e35~amd64~~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:2:CatalogDB: 4:55:38 AM 9/12/2016: SyncDB:: A
utoMerged-drivers~31bf3856ad364e35~amd64~ja-JP~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:3:CatalogDB: 4:55:38 AM 9/12/2016: SyncDB:: A
utoMerged-drivers~31bf3856ad364e35~amd64~~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:4:CatalogDB: 4:55:38 AM 9/12/2016: SyncDB:: A
utoMerged-ds~31bf3856ad364e35~amd64~ja-JP~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:5:CatalogDB: 4:55:39 AM 9/12/2016: SyncDB:: A
utoMerged-ds~31bf3856ad364e35~amd64~~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:6:CatalogDB: 4:55:39 AM 9/12/2016: SyncDB:: A
utoMerged-enduser~31bf3856ad364e35~amd64~ja-JP~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:7:CatalogDB: 4:55:39 AM 9/12/2016: SyncDB:: A
utoMerged-enduser~31bf3856ad364e35~amd64~~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:8:CatalogDB: 4:55:40 AM 9/12/2016: SyncDB:: A
utoMerged-inetcore~31bf3856ad364e35~amd64~ja-JP~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:9:CatalogDB: 4:55:40 AM 9/12/2016: SyncDB:: A
utoMerged-inetcore~31bf3856ad364e35~amd64~~10.0.14393.0.cat
windows\system32\catroot2\dberr.txt:10:CatalogDB: 4:55:40 AM 9/12/2016: SyncDB::
AutoMerged-mergedcomponents~31bf3856ad364e35~amd64~ja-JP~10.0.14393.0.cat
...以下略

この例では、C:\Windows\System32 のディレクトリ配下にある「~.txt」拡張子のファイルをすべて調べ、文字列 “Microsoft” を検索しています。

CaseSensitive オプションは、Select-String で一致を見つけるためには、”Microsoft” の “M” が大文字で、他の文字は小文字である必要があることを示します。

例6:一致しないプロセスを検索する

PS C:\> Get-Process | Out-File process.txt
PS C:\> Select-String -Path process.txt -Pattern idle, svchost -NotMatch

process.txt:1:
process.txt:2:Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName

process.txt:3:-------  ------    -----      -----     ------     --  -- -----------

process.txt:4:    309      19     9688      29392      13.75   2852   1 conhost

process.txt:5:    226      10     1812       5080       0.22    336   0 csrss

process.txt:6:    236      13     2100      12744       0.88    404   1 csrss

process.txt:7:    119       8     1780       5028       0.03   2932   3 csrss

process.txt:8:    320      17    11244      24260       0.03    668   3 dwm

process.txt:9:    434      29    20316      67252       1.55    764   1 dwm

process.txt:10:   1658      77    32452     107068       6.53   1340   1 explorer

process.txt:12:    335      21     6724      26968       0.11   1300   1 ImeBroker

process.txt:13:    486      28    11872      48904       0.20   3620   3 LogonUI

process.txt:14:    928      22     5600      14504       5.52    540   0 lsass

process.txt:15:    188      12     2844       9660       0.05   2508   0 msdtc

process.txt:16:    519      61   109808     103372      18.45   1544   0 MsMpEng

process.txt:17:   1158      39   173024     199880      29.59   3100   1 powershell

process.txt:18:    276      12     2284      12400       0.08   2288   1 rdpclip

process.txt:19:    228      15     4720      21552       0.19   3000   1 RuntimeBroker

process.txt:20:    625      32    13252      51620       0.31   2688   1 SearchUI

process.txt:21:    224       9     3512       7592       1.80    524   0 services

process.txt:22:    873      36    27572      74840       0.83   2628   1 ShellExperienceHost

process.txt:23:    362      14     3904      19812       0.09   3036   1 sihost

process.txt:24:     54       2      380       1176       0.05    256   0 smss

process.txt:25:    484      26     7504      19432       2.23   1328   0 spoolsv

process.txt:40:    935       0      124        140     268.97      4   0 System

process.txt:41:    290      23     4336      16512       0.08   1308   1 taskhostw

process.txt:42:     94       8     1056       5848       0.06    424   0 wininit

process.txt:43:    186       9     1864       9904       0.14    452   1 winlogon

この例では、Process.txt ファイルで、単語 “idle” または “svchost” を含まないテキスト行を検索します。

コメントを残す

メールアドレスが公開されることはありません。