最近在培訓PowerShell,在講到Pipeline的時候,對於我這種長期和資料(資料庫)打交道的人來說,覺得很實用,所以寫此博文,記錄一下。
無論是在Linux中寫Bash指令碼還是在Window上寫PowerShell,管道符”|“是一個非常有用的工具。它提供了將前一個命令的輸出作為下一個命令的輸入的功能。在資料處理中,我們也可以使用管道符對資料進行各種操作。
Import&Export匯入匯出
先說匯入匯出是為了能夠為接下來的資料處理準備資料。在PowerShell中我們也可以通過各種Get-XXX命令獲得各種各樣需要的資料,但是並不是所有作業系統和各個版本的PowerShell都支援某個命令的。比如Get-Volume命令,用於獲得每個磁碟的資訊,但是這個命令不能在Win7下執行,只能在Win8或Win2012Server下執行。
最常見,最簡單的外部資料來源就是CSV檔案了。我們可以使用Export-Csv命令將PowerShell中的物件轉換為CSV格式,持久化到磁碟上。比如我們將當前的所有程式資訊匯出為CSV檔案,命令為:
(注意,如果是有中文內容建議設定Encoding為Unicode或者UTF8)
Import-Csv命令是匯入外部的CSV檔案到記憶體。比較剛才匯出的CSV檔案,我們接下來要對這個檔案進行處理。我們可以將檔案的內容儲存到變數$data中。命令為:
當然,我們也可以先進行型別轉換,然後儲存。命令為:
Sorting排序
前面我們已經將CSV的內容載入到$data變數中了,那麼如果我們要按照某一個欄位排序,可以使用Sort-Object命令。
比如我們要Name這個欄位排序,並輸出排序後的結果,那麼命令為:
也可以簡寫為:
如果是需要多個欄位排序,那麼可以將欄位列在後面,欄位之間用逗號隔開。
如果是逆向排序,那麼需要在欄位後面加引數-Descending
Selecting選取
選取相當於SQL中的SELECT命令。對應的PowerShell命令是Select-Object,可以簡寫為Select。該命令後面跟上要選取的列名即可。如果是要選取所有的列,也可以使用*表示。
選取所有列,那麼命令就是:
如果是隻選取前面幾條資料,那麼可以使用-First引數。比如我們按Handles排序,只檢視頭10條程式記錄的名字和Handles。命令為:
另外還有引數-Last選取的是最後幾條記錄,-Skip可以選擇跳過一定記錄。
Calculate計算列
在SELECT的時候,我們可以使用函式對其中的列進行運算,使用的語法是:
n='New Column Name';
e={ $_.xxxCalc }
}
其中的$_就是表示當前的記錄。
比如VM列記錄的是以Byte為單位的資料,我們先新建一列名為”VM(MB)”,其值是換算成MB的結果,那麼我們可以寫為:
Measuring度量
說度量可能有點不是很清晰,其實就是對應SQL中的聚合函式。比如 SUM, Max,Min之類的,需要使用Measure-Object命令。比如要檢視有多少個程式,最小的Handles和最大的Handles,那麼命令是:
既然說到SQL中的聚合函式,那麼自然就會想到另外一個關鍵字Group By。在PowerShell中也有對應的命令Group-Object。如果我們想要按程式的Name進行分組,檢視每個程式名對應的VM總大小。那麼我們可以先按Name進行Group:
這時我們可以看到系統返回的結果有3列:Count,Name,Group。而我們要進行聚合的VM值是在Group中。這時需要用到前面提到的Select命令。
Filter過濾
過濾相當於SLQ中的Where語句,在PowerShell中使用Where-Object命令。可以簡寫為Where,甚至可以簡寫為”?”。在普通程式裡面我們遇到的比較運算和邏輯運算在PowerShell中有所不同,是這樣的引數:
Comparison | Case-InSensitive | Case-sensitive |
Equality | -eq | -ceq |
Inequality | -ne | -cne |
Greater than | -gt | -cgt |
Less than | -lt | -clt |
Greater than or equal to | -ge | -cge |
Less than or equal to | -le | -cle |
Wildcard equality | -like | -clike |
-and 和-or用於邏輯運算。
仍然以前面load的$data為例,我們要檢視以W開頭的程式的Handles和Name,那麼命令為:
如果是多個條件,既要以w開頭,還要VM大於100M的程式,那麼命令為:
Enumeration列舉
列舉相當於C#中的Foreach函式,或者說是SQL中的遊標,對於每一行資料,都進行一個運算或者函式處理。在PowerShell中對應的命令是ForEach-Object,可以簡寫為ForEach,還可以進一步簡寫為”%“。
比如我們要將VM改為MB為單位,可以對每一行資料進行運算:
執行該命令後我們再檢視$data就會發現VM列已經改變了。
另外對於Foreach命令,還有兩個比較有用的引數-Begin –End,用於在做For迴圈之前呼叫和迴圈結束後呼叫。
比如我們想把某一列寫入一個檔案,我們可以在-Begin時建立檔案,記錄開始的時間,然後Foreach中Append內容到檔案,最後把結束時間寫入: