使用管道符在PowerShell中进行各种数据操作
最近在培訓(xùn)PowerShell,在講到Pipeline的時候,對于我這種長期和數(shù)據(jù)(數(shù)據(jù)庫)打交道的人來說,覺得很實(shí)用,所以寫此博文,記錄一下。
無論是在Linux中寫B(tài)ash腳本還是在Window上寫PowerShell,管道符”|“是一個非常有用的工具。它提供了將前一個命令的輸出作為下一個命令的輸入的功能。在數(shù)據(jù)處理中,我們也可以使用管道符對數(shù)據(jù)進(jìn)行各種操作。
Import&Export導(dǎo)入導(dǎo)出
先說導(dǎo)入導(dǎo)出是為了能夠?yàn)榻酉聛淼臄?shù)據(jù)處理準(zhǔn)備數(shù)據(jù)。在PowerShell中我們也可以通過各種Get-XXX命令獲得各種各樣需要的數(shù)據(jù),但是并不是所有操作系統(tǒng)和各個版本的PowerShell都支持某個命令的。比如Get-Volume命令,用于獲得每個磁盤的信息,但是這個命令不能在Win7下運(yùn)行,只能在Win8或Win2012Server下運(yùn)行。
最常見,最簡單的外部數(shù)據(jù)源就是CSV文件了。我們可以使用Export-Csv命令將PowerShell中的對象轉(zhuǎn)換為CSV格式,持久化到磁盤上。比如我們將當(dāng)前的所有進(jìn)程信息導(dǎo)出為CSV文件,命令為:
Get-Process?|?Export-Csv?C:\test.csv?-Encoding?Unicode(注意,如果是有中文內(nèi)容建議設(shè)置Encoding為Unicode或者UTF8)
Import-Csv命令是導(dǎo)入外部的CSV文件到內(nèi)存。比較剛才導(dǎo)出的CSV文件,我們接下來要對這個文件進(jìn)行處理。我們可以將文件的內(nèi)容保存到變量$data中。命令為:
$data=Import-Csv?C:\test.csv?-Encoding?Unicode當(dāng)然,我們也可以先進(jìn)行類型轉(zhuǎn)換,然后保存。命令為:
$data?|?ConvertTo-Csv?|?Out-File?C:\test.csv?-Encoding?utf8Sorting排序
前面我們已經(jīng)將CSV的內(nèi)容載入到$data變量中了,那么如果我們要按照某一個字段排序,可以使用Sort-Object命令。
比如我們要Name這個字段排序,并輸出排序后的結(jié)果,那么命令為:
$data?|?Sort-Object?Name也可以簡寫為:
$data?|?Sort?Name如果是需要多個字段排序,那么可以將字段列在后面,字段之間用逗號隔開。
$data?|?Sort?Name,Handles如果是逆向排序,那么需要在字段后面加參數(shù)-Descending
$data?|?Sort?Name?–DescendingSelecting選取
選取相當(dāng)于SQL中的SELECT命令。對應(yīng)的PowerShell命令是Select-Object,可以簡寫為Select。該命令后面跟上要選取的列名即可。如果是要選取所有的列,也可以使用*表示。
$data?|?select?Name,VM選取所有列,那么命令就是:
$data?|?select?*如果是只選取前面幾條數(shù)據(jù),那么可以使用-First參數(shù)。比如我們按Handles排序,只查看頭10條進(jìn)程記錄的名字和Handles。命令為:
$data?|?sort?Handles?|?select?Handles,Name?-First?10另外還有參數(shù)-Last選取的是最后幾條記錄,-Skip可以選擇跳過一定記錄。
Calculate計算列
在SELECT的時候,我們可以使用函數(shù)對其中的列進(jìn)行運(yùn)算,使用的語法是:
@{???n='New?Column?Name';?
??e={?$_.xxxCalc?}?
}
其中的$_就是表示當(dāng)前的記錄。
比如VM列記錄的是以Byte為單位的數(shù)據(jù),我們先新建一列名為”VM(MB)”,其值是換算成MB的結(jié)果,那么我們可以寫為:
$data?|?select?Name,VM,@{n="VM(MB)";e={$_.VM/1MB}}?Measuring度量
說度量可能有點(diǎn)不是很清晰,其實(shí)就是對應(yīng)SQL中的聚合函數(shù)。比如 SUM, Max,Min之類的,需要使用Measure-Object命令。比如要查看有多少個程序,最小的Handles和最大的Handles,那么命令是:
$data?|?Measure-Object?-Property?Handles?-Minimum?-Maximum既然說到SQL中的聚合函數(shù),那么自然就會想到另外一個關(guān)鍵字Group By。在PowerShell中也有對應(yīng)的命令Group-Object。如果我們想要按進(jìn)程的Name進(jìn)行分組,查看每個進(jìn)程名對應(yīng)的VM總大小。那么我們可以先按Name進(jìn)行Group:
$data?|?Group-Object?Name這時我們可以看到系統(tǒng)返回的結(jié)果有3列:Count,Name,Group。而我們要進(jìn)行聚合的VM值是在Group中。這時需要用到前面提到的Select命令。
$data?|?Group-Object?Name?|?select?Name,Count,@{n="TotalVM";e={($_.Group?|?Measure-Object?-Property?VM?-Sum).Sum}}Filter過濾
過濾相當(dāng)于SLQ中的Where語句,在PowerShell中使用Where-Object命令。可以簡寫為Where,甚至可以簡寫為”?”。在普通程序里面我們遇到的比較運(yùn)算和邏輯運(yùn)算在PowerShell中有所不同,是這樣的參數(shù):
| 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用于邏輯運(yùn)算。
仍然以前面load的$data為例,我們要查看以W開頭的進(jìn)程的Handles和Name,那么命令為:
$data?|??{?$_.Name?-like?'W*'}|?select?Handles,Name如果是多個條件,既要以w開頭,還要VM大于100M的進(jìn)程,那么命令為:
$data?|??{?$_.Name?-like?'W*'?-and?$_.VM?-gt?100MB}|?select?Handles,Name,VMEnumeration枚舉
枚舉相當(dāng)于C#中的Foreach函數(shù),或者說是SQL中的游標(biāo),對于每一行數(shù)據(jù),都進(jìn)行一個運(yùn)算或者函數(shù)處理。在PowerShell中對應(yīng)的命令是ForEach-Object,可以簡寫為ForEach,還可以進(jìn)一步簡寫為”%“。
比如我們要將VM改為MB為單位,可以對每一行數(shù)據(jù)進(jìn)行運(yùn)算:
$data?|?%?{$_.VM=$_.VM/1MB}運(yùn)行該命令后我們再查看$data就會發(fā)現(xiàn)VM列已經(jīng)改變了。
$data?|?select?Name,VM另外對于Foreach命令,還有兩個比較有用的參數(shù)-Begin –End,用于在做For循環(huán)之前調(diào)用和循環(huán)結(jié)束后調(diào)用。
比如我們想把某一列寫入一個文件,我們可以在-Begin時創(chuàng)建文件,記錄開始的時間,然后Foreach中Append內(nèi)容到文件,最后把結(jié)束時間寫入:
$data?|?%?-Begin?{?Get-Date?|?Out-File?C:\test.txt?}?-Process?{?$_.Name?|?Out-File?C:\test.txt?-Append}?-End?{?Get-Date?|?Out-File?C:\test.txt?-Append}轉(zhuǎn)載于:https://www.cnblogs.com/studyzy/p/4518807.html
總結(jié)
以上是生活随笔為你收集整理的使用管道符在PowerShell中进行各种数据操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 表单提交对chrome记住密码的影响
- 下一篇: [ActionScript 3.0] 对