使用管道符在PowerShell中进行各类数据操做

最近在培训PowerShell,在讲到Pipeline的时候,对于我这种长期和数据(数据库)打交道的人来讲,以为很实用,因此写此博文,记录一下。数据库

不管是在Linux中写Bash脚本仍是在Window上写PowerShell,管道符”|“是一个很是有用的工具。它提供了将前一个命令的输出做为下一个命令的输入的功能。在数据处理中,咱们也可使用管道符对数据进行各类操做。函数

Import&Export导入导出

先说导入导出是为了可以为接下来的数据处理准备数据。在PowerShell中咱们也能够经过各类Get-XXX命令得到各类各样须要的数据,可是并非全部操做系统和各个版本的PowerShell都支持某个命令的。好比Get-Volume命令,用于得到每一个磁盘的信息,可是这个命令不能在Win7下运行,只能在Win8或Win2012Server下运行。工具

最多见,最简单的外部数据源就是CSV文件了。咱们可使用Export-Csv命令将PowerShell中的对象转换为CSV格式,持久化到磁盘上。好比咱们将当前的全部进程信息导出为CSV文件,命令为:spa

Get- Process | Export-Csv C:\test.csv -Encoding Unicode

(注意,若是是有中文内容建议设置Encoding为Unicode或者UTF8)操作系统

Import-Csv命令是导入外部的CSV文件到内存。比较刚才导出的CSV文件,咱们接下来要对这个文件进行处理。咱们能够将文件的内容保存到变量$data中。命令为:code

$data=Import-Csv C:\test.csv -Encoding Unicode

固然,咱们也能够先进行类型转换,而后保存。命令为:对象

$data | ConvertTo-Csv | Out -File C:\test.csv -Encoding utf8

Sorting排序

前面咱们已经将CSV的内容载入到$data变量中了,那么若是咱们要按照某一个字段排序,可使用Sort-Object命令。blog

好比咱们要Name这个字段排序,并输出排序后的结果,那么命令为:排序

$data | Sort-Object Name

也能够简写为:进程

$data | Sort Name

若是是须要多个字段排序,那么能够将字段列在后面,字段之间用逗号隔开。

$data | Sort Name,Handles

若是是逆向排序,那么须要在字段后面加参数-Descending

$data | Sort Name –Descending

Selecting选取

选取至关于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能够选择跳过必定记录。

Calculate计算列

在SELECT的时候,咱们可使用函数对其中的列进行运算,使用的语法是:

@{ 
  n='New Column Name'; 
  e={  $_.xxxCalc } 
}

其中的$_就是表示当前的记录。

好比VM列记录的是以Byte为单位的数据,咱们先新建一列名为”VM(MB)”,其值是换算成MB的结果,那么咱们能够写为:

$data | select Name,VM,@{n= " VM(MB) ";e={ $_.VM/1MB}} 

Measuring度量

说度量可能有点不是很清晰,其实就是对应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,@{n= " TotalVM ";e={( $_.Group | Measure-Object -Property VM -Sum).Sum}}

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,那么命令为:

$data | ?{  $_.Name  -like 'W*'}| select Handles,Name

若是是多个条件,既要以w开头,还要VM大于100M的进程,那么命令为:

$data | ?{  $_.Name  -like 'W*'  -and  $_.VM  -gt 100MB}| select Handles,Name,VM

Enumeration枚举

枚举至关于C#中的Foreach函数,或者说是SQL中的游标,对于每一行数据,都进行一个运算或者函数处理。在PowerShell中对应的命令是ForEach-Object,能够简写为ForEach,还能够进一步简写为”%“。

好比咱们要将VM改成MB为单位,能够对每一行数据进行运算:

$data | % { $_.VM= $_.VM/1MB}

运行该命令后咱们再查看$data就会发现VM列已经改变了。

$data | select Name,VM

另外对于Foreach命令,还有两个比较有用的参数-Begin –End,用于在作For循环以前调用和循环结束后调用。

好比咱们想把某一列写入一个文件,咱们能够在-Begin时建立文件,记录开始的时间,而后Foreach中Append内容到文件,最后把结束时间写入:

$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}
相关文章
相关标签/搜索