PowerShellGrep
文字列またはテキストファイル全体のコンテンツをスキャンする必要がある場合は、PowerShell コードを開発するときにどこに行きますか?Linux を頻繁に使用したことがある場合は、人気のある grep ユーティリティに精通しています。grep ユーティリティを使用すると、ユーザーはさまざまなパラメータを使用してテキストを検索できます。ただし、Windows では使用できません。したがって、このシナリオでは、PowerShell に Select-String コマンドレットがあります。
Select-String コマンドレット
Select-String は、デフォルトで各行の最初の一致をチェックし、次に、一致した行に属する行番号、ファイル名、およびテキストを表示します。Select-String は、バイト順マーク(BOM)を使用してエンコードタイプを決定することにより、Unicode テキストなどの複数のファイルエンコーディングでも機能する場合があります。Select-String は、BOM が欠落している場合、UTF8 ファイルであると見なします。
Select-String
コマンドレットのいくつかの使用法を以下に説明します。
PowerShell を使用した一般的な Grep タスク
例から始めましょう。名前とアドレスを含む文字列があり、その文字列が構造化されていないとします。名前を抽出したいと思います。それでは、どのようにそれを行うのかを以下に説明します。
||Sara Peiris|| 37, De silva road, Panadura
--||Tim Gangster||-- 345, Yolks street,KL
==|Suz Maker|== 44 Main, Cydney, CA
上記のテキストは users
変数に割り当てられています。したがって、-Pattern
パラメータを使用して名前を検索しようとします。
test | Select-String -Pattern 'Sara Peiris'
出力:
ここでは、Select-String メソッドは機能しましたが、文字列全体を渡したため、指定されたメソッドを返さなかったことがわかります。したがって、特定の各エントリは 1 行で指定されるため、改行文字を使用して 1 行を分割して渡してみましょう。
PS> test = test -split "`n"
PS> test | Select-String -Pattern 'Sara Peiris'
出力:
ここでは、1 行が返されることがわかります。次に、複数行を返す方法を検討する必要があります。
PowerShellSelect-String を使用したパターンの検索
ここでは、すべての行に有効な共通のパターンを見つける必要があります。したがって、前の例をとると、すべての名前が|
で囲まれていることがわかります。名前はスペースで区切られます。それでは、正規表現を使用してこのパターンを取得し、-Pattern
パラメーターを指定して送信してみましょう。
Select-String
は正規表現を使用して各行を取得しました。その後、すべての名前を区切る必要があります。現時点では、それぞれのアドレスは必要ありません。これを実現するために、Select-String によって返される一致した各オブジェクトの Matches
属性を使用します。
PS> test | Select-String -Pattern '\|\w+ \w+\|' | foreach {$_.Matches}
出力:
これで、Value 属性に必要な名前が付けられていることがわかりますが、それらはまだ|
で囲まれています。キャラクター。これは、正規表現の一致に|
が含まれているためです。名前の文字。
パイプ文字は引き続きフィルターに含める必要がありますが、一致として返されることは望ましくありません。正規表現グループは 1つの方法です。返したい結果は、正規表現グループを示す括弧で囲まれています。この状況では、名前と名前を表す正規表現文字列を囲んで再試行します。
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches}
出力:
|
値には文字が表示されますが、グループが {0,1}
になっていることがわかります。これは、Select-String がグループを識別したことを意味します。
このグループを表示するには、各ループの for
に参照を再挿入します。各グループ属性は配列であるため、最初のメンバーを括弧で囲み、Value プロパティを使用して参照できます。
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches.Groups[1].Value}
出力:
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.