PowerShellでのGrep-選択-文字列と比較



Grep Under Powershell Select String



使用help Select-String -ShowWindow 2つの段落を持つ中国語のヘルプファイルを簡単に入手できます。

  1. Select-Stringコマンドレットは、入力文字列およびファイル内のテキストおよびテキストパターンを検索します。 UNIXのGrepやWindowsのFindstrのように使用できます。 「Select-String」またはそのエイリアス「sls」と入力できます。
  2. Select-Stringは、UNIXのGrepコマンドおよびWindowsのFindStrコマンドに似ています。

記事のディレクトリ


Linux / Unixについてご存知のように、grepコマンドには次の一般的なパラメーターがあります。
画像
この記事ではSelect-Stringを使用しますこれらの機能を1つずつ実装します。

によるgrep -n条件を満たす各行番号を一覧表示するため、PowerShellはデフォルトで行数を出力しますが、ここでは説明しません。



再帰検索

比較grep -r
使用Get-ChildItem -Path file path -Recurse | select-string -pattern 'pattern'
例:私はE:2Note &&Information estにいますファイルを持っているFactoryPattern.txtそしていくつかのディレクトリ:
画像
上記のコマンドの結果は次のとおりです(このディレクトリにcdしたため、-Pathを指定しませんでした)
画像
出力が少し乱雑で、ファイル階層が表示されません。もっと美しい方法があるかどうかわかりません。誰かが提案してくれることを願っています。下の写真はgrepで、少し面倒です。
画像

https://antjanus.com/blog/web-development-tutorials/how-to-grep-in-powershell/ 私は美しい出力を見る方法を見つけました。表示が少し間違っています...



PS E:2Note &&Information est> Get-ChildItem -Recurse | Select-String -Pattern 'dry' | Select Filename, LineNumber, Line, Path | Format-Table

画像

大文字と小文字を区別

比較grep -i
スイッチパラメータの使用(SwitchParameter)-CaseSensitive
デフォルトでは、一致では大文字と小文字は区別されません。

一致する行数のみを出力します

比較grep -c



PS C:>$f = select-string -path audit.log -pattern 'logon failed' PS C:>$f.count

2番目のコマンドは、オブジェクト配列のCountプロパティを使用して、見つかった一致の数を表示します。
たとえば、4行ありますlogon failedパターン、出力は4です。

一致する行の前後の指定された行数

比較grep -C N
-Context

PS C:>$f = select-string -path audit.log -pattern 'logon failed' -context 2, 3

このコマンドは、Audit.Logファイルで「logonfailed」というフレーズを検索します。 Contextパラメーターを使用して、一致の最初の2行と最後の3行をキャプチャします。

複数の一致を検索する(貪欲モード)

スイッチパラメータの使用-AllMatches
各テキスト行で複数の一致を検索します。このパラメーターがない場合、Select-Stringテキストの各行の最初の一致のみが検索されます。
このパラメーターは、ドキュメントをこのように作成するのに役立ちますが、Select-Stringはデフォルトで検索できるように見えるため、その役割についてはよくわかりません。

複数のモードに一致する

比較Grep -e expression
から https://cloud.tencent.com/developer/ask/41837

たとえば、「VendorEnquiry」および「Failed」という単語を含むC: Logsのすべてのファイルを検索します。

方法1

Get-ChildItem C:Logs | where $_ | where $_ | ...

方法2

方法1を改善するには、各Select-String呼び出しを手動で記述する代わりに、フィルターを使用してプロセスを単純化し、複数のパターンに一致させることができます。

filter MultiSelect-String( [string[]]$Patterns ) { # Check the current item against all patterns. foreach( $Pattern in $Patterns ) { # If one of the patterns does not match, skip the item. $matched = @($_ | Select-String -Pattern $Pattern) if( -not $matched ) { return } } # If all patterns matched, pass the item through. $_ } Get-ChildItem C:Logs | MultiSelect-String 'VendorEnquiry','Failed',...

方法3

これらの2つの単語を任意の順序で一致させる場合は、次を使用します。

Get-ChildItem C:Logs| select-string -pattern '(VendorEnquiry.*Failed)|(Failed.*VendorEnquiry)'

逆行する

比較grep -v
スイッチパラメータの使用-NotMatch
指定されたパターンに一致しないテキストを検索します。

出力は必要ありません

比較grep -q
スイッチパラメータの使用-Quiet
MatchInfoオブジェクトの代わりにブール値(trueまたはfalse)を返します。パターンが見つかった場合、値は「true」です。それ以外の場合、値は「false」です。

ファイルパターンから一致するパターンを読み取る

比較grep -fこれはgrep --file=filenameです。ここで、filenameは複数行のテキストを含むファイル名を指し、テキストの各行は一致するパターンです。

Get-Content .doc.txt | Select-String -Pattern (Get-Content . egex.txt)

ここで、。 regex.txtは各行が一致するパターンであるファイルであり、。 doc.txtは検索するファイルです。
参照 https://stackoverflow.com/questions/15199321/powershell-equivalent-to-grep-f


grep-w word-l -hでここでは言うまでもなく、実際的な例を見たことがありません。


突然、PowerSPを使用してgrepを使用すると中国語を検索できるが、cmdでは検索できないことがわかりました...
画像
画像
つまり、PowerShellの使用は、Linux / UnixコマンドとPowerShellが提供するコマンドの両方を使用して、2つの武器を持っているかのように実行できます。

もちろん、この記事は簡単な比較に焦点を当てています。 Select-Stringとgrepのその他の高度な使用法については、ここでは説明しません。