最近在培訓powershell,在講到pipeline的時候,對於我這種長期和資料(資料庫)打交道的人來說,覺得很實用,所以寫此博文,記錄一下。
無論是在linux中寫bash指令碼還是在window上寫powershell,管道符」|「是乙個非常有用的工具。它提供了將前乙個命令的輸出作為下乙個命令的輸入的功能。在資料處理中,我們也可以使用管道符對資料進行各種操作。
先說匯入匯出是為了能夠為接下來的資料處理準備資料。在powershell中我們也可以通過各種get-***命令獲得各種各樣需要的資料,但是並不是所有作業系統和各個版本的powershell都支援某個命令的。比如get-volume命令,用於獲得每個磁碟的資訊,但是這個命令不能在win7下執行,只能在win8或win2012server下執行。
最常見,最簡單的外部資料來源就是csv檔案了。我們可以使用export-csv命令將powershell中的物件轉換為csv格式,持久化到磁碟上。比如我們將當前的所有程序資訊匯出為csv檔案,命令為:
get-
process | export-csv c:\test.csv -encoding unicode
(注意,如果是有中文內容建議設定encoding為unicode或者utf8)
import-csv命令是匯入外部的csv檔案到記憶體。比較剛才匯出的csv檔案,我們接下來要對這個檔案進行處理。我們可以將檔案的內容儲存到變數$data中。命令為:
$data=import-csv c:\test.csv -encoding unicode
當然,我們也可以先進行型別轉換,然後儲存。命令為:
$data | convertto-csv | out
-file c:\test.csv -encoding utf8
前面我們已經將csv的內容載入到$data變數中了,那麼如果我們要按照某乙個字段排序,可以使用sort-object命令。
比如我們要name這個字段排序,並輸出排序後的結果,那麼命令為:
$data | sort-object name
也可以簡寫為:
$data | sort name
如果是需要多個字段排序,那麼可以將字段列在後面,字段之間用逗號隔開。
$data | sort name,handles
如果是逆向排序,那麼需要在字段後面加引數-descending
$data | sort name –descending
選取相當於sql中的select命令。對應的powershell命令是select-object,可以簡寫為select。該命令後面跟上要選取的列名即可。如果是要選取所有的列,也可以使用*表示。
$data | select name,vm
選取所有列,那麼命令就是:
$data | select *
如果是只選取前面幾條資料,那麼可以使用-first引數。比如我們按handles排序,只檢視頭10條程序記錄的名字和handles。命令為:
$data | sort handles | select handles,name -first 10
另外還有引數-last選取的是最後幾條記錄,-skip可以選擇跳過一定記錄。
在select的時候,我們可以使用函式對其中的列進行運算,使用的語法是:
@ }
其中的$_就是表示當前的記錄。
比如vm列記錄的是以byte為單位的資料,我們先新建一列名為」vm(mb)」,其值是換算成mb的結果,那麼我們可以寫為:
$data | select name,vm,@}
說度量可能有點不是很清晰,其實就是對應sql中的聚合函式。比如 sum, max,min之類的,需要使用measure-object命令。比如要檢視有多少個程式,最小的handles和最大的handles,那麼命令是:
$data | measure-object -property handles -minimum -maximum
既然說到sql中的聚合函式,那麼自然就會想到另外乙個關鍵字group by。在powershell中也有對應的命令group-object。如果我們想要按程序的name進行分組,檢視每個程序名對應的vm總大小。那麼我們可以先按name進行group:
$data | group-object name
這時我們可以看到系統返回的結果有3列:count,name,group。而我們要進行聚合的vm值是在group中。這時需要用到前面提到的select命令。
$data | group-object name | select name,count,@}
過濾相當於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,那麼命令為:
$data | ?| select handles,name
如果是多個條件,既要以w開頭,還要vm大於100m的程序,那麼命令為:
$data | ?| select handles,name,vm
列舉相當於c#中的foreach函式,或者說是sql中的游標,對於每一行資料,都進行乙個運算或者函式處理。在powershell中對應的命令是foreach-object,可以簡寫為foreach,還可以進一步簡寫為」%「。
比如我們要將vm改為mb為單位,可以對每一行資料進行運算:
$data | %
執行該命令後我們再檢視$data就會發現vm列已經改變了。
$data | select name,vm
另外對於foreach命令,還有兩個比較有用的引數-begin –end,用於在做for迴圈之前呼叫和迴圈結束後呼叫。
$data | % -
begin -
process {
$_.name | out
end { get-date | out
使用管道符在PowerShell中進行各種資料操作
最近在培訓powershell,在講到pipeline的時候,對於我這種長期和資料 資料庫 打交道的人來說,覺得很實用,所以寫此博文,記錄一下。無論是在linux中寫bash指令碼還是在window上寫powershell,管道符 是乙個非常有用的工具。它提供了將前乙個命令的輸出作為下乙個命令的輸入...
grep和管道符
找出資料夾下包含 aaa 同時不包含 bbb 的檔案,然後把他們重新生成一下。要求只能用一行命令。我對linux 是個白痴,工作了之後才開始接觸的,會用的命令只有那幾個常用的。這個問題對我來說就有點難度,我只是大概知道查詢檔案用 grep 其他的就不知道了。不過沒關係,用google 查詢到 gre...
grep和管道符
找出資料夾下包含 aaa 同時不包含 bbb 的檔案,然後把他們重新生成一下。要求只能用一行命令。我對linux 是個白痴,工作了之後才開始接觸的,會用的命令只有那幾個常用的。這個問題對我來說就有點難度,我只是大概知道查詢檔案用 grep 其他的就不知道了。不過沒關係,用google 查詢到 gre...