zoukankan      html  css  js  c++  java
  • 使用管道符在PowerShell中进行各种数据操作

    最近在培训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: est.csv -Encoding Unicode

    (注意,如果是有中文内容建议设置Encoding为Unicode或者UTF8)

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

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

    当然,我们也可以先进行类型转换,然后保存。命令为:

    $data | ConvertTo-Csv | Out-File C: est.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列已经改变了。

    $data | select Name,VM

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

    比如我们想把某一列写入一个文件,我们可以在-Begin时创建文件,记录开始的时间,然后Foreach中Append内容到文件,最后把结束时间写入:

    $data | % -Begin { Get-Date | Out-File C: est.txt } -Process { $_.Name | Out-File C: est.txt -Append} -End { Get-Date | Out-File C: est.txt -Append}
  • 相关阅读:
    c语言结构体数组引用
    c语言结构体数组定义的三种方式
    如何为SAP WebIDE开发扩展(Extension),并部署到SAP云平台上
    SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
    使用SAP API portal进行SAP SuccessFactors的API测试
    SAP UI5应用里的页面路由处理
    在SAP WebIDE Database Explorer里操作hdi实例
    如何使用SAP事务码SAT进行UI应用的性能分析
    使用SAP WebIDE进行SAP Cloud Platform Business Application开发
    SAP CRM WebClient UI ON_NEW_FOCUS的用途
  • 原文地址:https://www.cnblogs.com/studyzy/p/4518807.html
Copyright © 2011-2022 走看看