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

无论是在Linux中写Bash脚本还是在Window上写PowerShell,管道符”|“是一个非常有用的工具。它提供了将前一个命令的输出作为下一个命令的输入的功能。在数据处理中,我们也可以使用管道符对数据进行各种操作。

Import&Export导入导出

先说导入导出是为了能够为接下来的数据处理准备数据。在PowerShell中我们也可以通过各种Get-XXX命令获得各种各样需要的数据,但是并不是所有操作系统和各个版本的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

Sorting排序

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

比如我们要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列已经改变了。

另外对于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}

使用管道符在PowerShell中进行各种数据操作的更多相关文章

  1. opencv中Mat类型数据操作与遍历

    Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是 ...

  2. for循环中进行联网请求数据、for循环中进行异步数据操作,数据排序错乱问题解决;

    for循环中进行联网请求数据,由于网络请求是异步的,第一个网络请求还没有回调,第二次第三次以及后续的网络请求又已经发出去了,有可能后续的网络请求会先回调:这时我们接收到的数据的排序就会错乱:怎么才能让 ...

  3. (4.31)sql server中的xml数据操作

    关键词:xml数据转为行列方式显示 常规案例: declare @data xml declare @h int set @data=' <bookstore> <row> & ...

  4. java中对于浮点型数据操作

    java的基本数据类型-浮点型:单精度(float)和双精度(double). float:单精度浮点数在机内占4个字节.有效数字8位.表示范围:-3.40E+38 ~ +3.40E+38; doub ...

  5. SQLServer2012中用于记录数据操作时刻的附加字段使用datetime2(3)就可以了

    datetime2(3)精确到毫秒(听说),约等于2005时代的datetime类型.实际上后者是精确到3.33毫秒(也是听说). ) = GETDATE(); ) = GETDATE(); ) = ...

  6. PowerShell中的基础数据类型

    PowerShell是一个面向对象的语言,在申明变量的时候不强制要求申明数据类型,使用$开头来申明变量即可. 基本数据类型 PowerShell本身是基于.Net开发出来的,所以在.Net中的基本数据 ...

  7. powershell中使用超大内存对象

    powershell中使用超大内存对象 简单介绍了powershell中超大内存对象的用途,开启powershell超大内存对象的办法. powershell 传教士 原创文章 2016-12-31 ...

  8. powershell中的两只爬虫

    --------------------序-------------------- (PowerShell中的)两只爬虫,两只爬虫,跑地快,爬网页不赖~~~ 一只基于com版的ie,一只基于.net中 ...

  9. 在本地主机上powershell中连接远程主机执行vbs脚本,得到执行结果(2008版及以上)

    在桌面版的主机上远程管理服务器版主机,在本地powershell中连接远程主机执行vbs脚本,得到执行结果. 执行步骤: 1.将本地主机上的Hyper.vbs复制到远程连接主机上.例如,本地vbs脚本 ...

随机推荐

  1. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  2. 1Z0-053 争议题目解析704

    1Z0-053 争议题目解析704 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 704.View the Exhibit and examine the data manipul ...

  3. Generator库co4.6使用及源码分析

    原文链接 http://www.cnblogs.com/ytu2010dt/p/6043947.html co4.x已经抛弃了原来thunk转而结合promise实现. 一:promise proms ...

  4. 【写给大家看的CSS】定位元素:使用position/display布局

    引言 使用position和display来实现的当鼠标移动到图片上时显示和隐藏文字或者视频的效果. 知识点 1.relative.absolute的使用. 当子元素使用position:absolu ...

  5. Ajax提交参数的值中带有html标签不能提交成功的解决办法(ASP.NET)

    最近在公司做资源及文章上传功能遇到一个小问题,被坑了好半天. 该功能就类似利用富文本编辑器发布信息,但是用Ajax提交数据,因此提交参数值中不可避免的含有html标签. 在本地运行代码一直没问题,总是 ...

  6. java基础面试题

    参考:http://blog.csdn.net/jackfrued/article/details/44921941 说未经允许不转载,我只好参考了. 1.面向对象的特征有哪些方面? 抽象:抽象是将一 ...

  7. HTTP请求方法详解

    HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源]     GET方法用来请求已被URI识别的资源.指定 ...

  8. 使用DapperExtensions实现简单仓储

    Dapper是一个轻量级的ORM框架,它只是一个IDbConnection的扩展文件.所以我们需要手写很多SQL,但是写CRUD的代码总是很无趣的.所有就有了DapperExtensions.Dapp ...

  9. 强大的HTTP包装开源项目ASIHTTPRequest介绍

    ASIHTTPRequest 是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装.它的特色功能如下: 1,下载的数据直接保存到内存或文件系统里 2,提供 ...

  10. Guava学习-目录

    备份一下地址: 目录 1. 基本工具 [Basic utilities] 让使用Java语言变得更舒适 1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服. ...