使用管道符在PowerShell中进行各种数据操作
2015-05-21 09:01
344 查看
最近在培训PowerShell,在讲到Pipeline的时候,对于我这种长期和数据(数据库)打交道的人来说,觉得很实用,所以写此博文,记录一下。
无论是在Linux中写Bash脚本还是在Window上写PowerShell,管道符”|“是一个非常有用的工具。它提供了将前一个命令的输出作为下一个命令的输入的功能。在数据处理中,我们也可以使用管道符对数据进行各种操作。
最常见,最简单的外部数据源就是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
比如我们要Name这个字段排序,并输出排序后的结果,那么命令为:
$data | Sort-Object Name 也可以简写为:
$data | Sort Name 如果是需要多个字段排序,那么可以将字段列在后面,字段之间用逗号隔开。
$data | Sort Name,Handles 如果是逆向排序,那么需要在字段后面加参数-Descending
$data | Sort Name –Descending
$data | select Name,VM 选取所有列,那么命令就是:
$data | select * 如果是只选取前面几条数据,那么可以使用-First参数。比如我们按Handles排序,只查看头10条进程记录的名字和Handles。命令为:
$data | sort Handles | select Handles,Name -First 10 另外还有参数-Last选取的是最后几条记录,-Skip可以选择跳过一定记录。
@{
n='New Column Name';
e={ $_.xxxCalc }
} 其中的$_就是表示当前的记录。
比如VM列记录的是以Byte为单位的数据,我们先新建一列名为”VM(MB)”,其值是换算成MB的结果,那么我们可以写为:
$data | select Name,VM,@{n="VM(MB)";e={$_.VM/1MB}}
$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}}
-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
比如我们要将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}
无论是在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 |
仍然以前面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}
相关文章推荐
- 转载:SQL through PowerShell 使用Powershell访问SQL并对数据进行读写增加删除操作
- [Sqlite]-->Java使用jdbc连接Sqlite数据库进行各种数据操作的详细过程
- Java使用jdbc连接Sqlite数据库,进行各种数据操作
- Qt实用技巧:使用QTableView、QSqlTableMode与QSqlDatabase对数据库数据进行操作
- easyUI使用分页过滤器对数据进行分页操作
- 使用Redisson、Jedis对redis进行管道操作(JAVA)
- Qt实用技巧:使用QTableView、QSqlTableMode与QSqlDatabase对数据库数据进行操作
- linux中使用shell进行数据库各种操作
- 在verilog中使用clogb2函数可进行log2操作,用来计算数据位宽
- hive(05)、使用JAVA对数据仓库HIVE进行操作
- Python使用SQLite和Excel操作进行数据分析
- Laravel中使用模型对数据进行操作
- BeJavaGod - 如何正确使用数据字典进行分类统一操作(一)
- 怎样使用YDB进行简单的数据操作
- 【Hadoop】HBase上安装使用Phoenix来用sql语句更新操作数据,安装的过程各种坑和经验
- 如何在 ASM 存储中使用 Data Pump (expdp impdp)进行数据导出导入操作
- lua教程十---使用Lua CJSON库进行encode与decode操作完成对Json数据转化
- java中使用JXL对Excel文件进行数据的写入、导出操作
- php7中使用mongoDB的聚合操作对数据进行分组求和统计操作
- 使用jq对表格数据进行操作