こんにちは。チェシャ男です。(-皿-)
今回は、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 のオブジェクトには Filename や Line などのプロパティが含まれるため、オブジェクト内の情報は、ファイル内のテキストを検索するときに役立ちます。
※入力がファイルから取得したものでない場合、これらのオプションの値は “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” を含まないテキスト行を検索します。