PowerShell でオブジェクトをユニークにするには Sort-Objec コマンドレットの -Unique オプションを使うか、ソート後のオブジェクトを Get-Unique コマンドレットするのが常套手段です。
でも、この方法では存在数がいくつあったのかわからないので、ユニークにして存在数をカウントするフィルタを書きました。
関数(function)は、1データを受け取る処理なのに対し、フィルタ(filter)はパイプラインでデーターを受け取ります。
(厳密に言うと、function もパイプライン処理できるのですが、混乱するので僕は function でパイプライン処理を書かないようにしています)
filter の場合、受け取ったオブジェクトは foreach と同様に $_ に分解されるので、分解するためのループを書く必要はありません。
更に、BEGIN、PROCESS、END で処理の流れを制御することができるので、初期処理/終了処理を簡潔に記述することができます。
BEGIN | 最初の一度だけ実行される処理(データが読み込まれる前) |
PROCESS | 通常処理 |
END | 最後の一度だけ実行される処理(PROCESSの後) |
フローチャートにするとこんな感じの流れになります
さて、本題のフィルターです。
アルゴリズムは、昔ながらキーブレークですね。
|
実行するとこんな感じになります。
PS C:\> Get-Process | sort -Property ProcessName | Count-Unique -Property ProcessName | ft ProcessName,Count -AutoSize ProcessName Count ----------- ----- ApplicationFrameHost 1 AppVShNotify 2 atkexComSvc 1 BtwRSupportService 1 chrome 25 CompanionApp 1 conhost 2 csrss 2 dllhost 1 dwm 1 EIZO EasyPIX 1 |
通常のオブジェクトだけではなく、syslog とかのログ集計にも便利です。
(syslog
からアタック解析するために書いたフィルタを汎用化しました)
とここまで書いて Group-Object で同様の事が出来ることに気が付きました w
Get-Process | sort -Property ProcessName | Group-Object -Property ProcessName | ft Name,Count -AutoSize
折角書いたので、同様処理のフィルタを書く際のサンプルにどうぞって事で
Copyright © MURA All rights reserved.