PowerShell与Unix Shell对比:八大实例

本文将从八个实例对比PowerShell和Unix Shell,通常是Linux Bourne Shell(包括sh、ksh和bash等)。二者存在非常大的差异,最大不同是PowerShell将对象作为基本的操作单元,而Unix Shell将字符串作为基本单元。相似之处是二者均有数量巨大内置命令,而且允许用户扩展。

AD:51CTO开启企业运维技术盛宴_嘀嘀、新浪、白鹭齐聚MDSA线下沙龙,赶紧报名吧!

本文将举例对比PowerShell和Unix Shell,通常是Linux Bourne Shell(包括sh、ksh和bash等)。二者存在非常大的差异,最大不同是PowerShell将对象作为基本的操作单元,而Unix Shell将字符串作为基本单元;相似之处是二者均有数量巨大内置命令,而且允许用户扩展。

1 实例:终止进程

在Unix操作系统中为了终止所有以字母“p”开头的进程,需要在命令行中运行下面的命令:

$ ps -e | grep " p" | awk '{ print $1 }' | xargs kill

通过ps命令获取了当前进程的清单并将获取的文本输出到grep命令中,该命令搜索文件名以“p”开头的进程。将输出发送给awk命令,从中选取第 1列(这里是进程的ID)并输出给xargs命令;xargs命令会对每个进程执行kill命令,从而终止所有以“p”开头的进程。尽管实现了功能,但是 整个命令却不可靠。因为ps命令的执行效果在不同操作系统中不同(甚至在相同的操作系统的不同版本中执行也会有差异)。如果不支持-e选项的ps在执行时 包含进程ID的列,则不一定是第1列,此时命令行的执行会出现问题。

类似地,如果要在PowerShell中执行相同的命令,只需要执行下面的操作:

PS C:\> get-process p* | stop-process

这里的命令查找所有以“p”开头的进程,并将其终止。Get-Process cmdlet带的参数是需要匹配的进程名,得到的结果对象被直接传递给Stop-Process cmdlet,这样即可结束对应的对象进程。

2  实例:结束过滤的进程

为查找并杀死占用内存超过10 MB的进程,在Unix命令行下需要执行如下命令:

$ ps -el | awk '{ if ( $6 > (1024*10)) { print $3 } }' |
grep -v PID | xargs kill

此命令的执行成功取决于用户已知道ps –el命令将会在第6列中返回进程占用的内存大小(以KB为单位)并且在第3列中包含PID属性,同时需要去掉ps命令输出的第1行。

接下来查看在PowerShell中对应的脚本:

PS C:\> get-process | where { $_.WS -gt 10MB } | stop-process

可以看到基于对象的命令相比基于文字的命令的好处,即不必关心包含进程占用内存大小或包含进程ID的部分所在的列。内存占用量能够通过进程名称引用,Where cmdlet可检查输入的对象并取得对象的属性。

3  实例:计算目录大小

在这个实例中将计算某个目录中包含文件的大小,遍历文件、获取其长度属性并叠加到一个变量中,最后打印变量。在Unix系统中的处理方式如下:

$ tot=0; for file in $( ls )
> do
> set -- $( ls -log $file )
> echo $3
> (( tot = $tot + $3 ))
> done; echo $tot

上例使用set命令为每个空格分隔的元素创建变量,这是在awk命令出现之前通常使用的Unix命令。如果使用了awk命令,将会减少相当的代码量,如下所示:

$ ls –l | awk ‘{ tot += $5; print tot; }’ | tail -1

这样降低了命令的复杂性,但是需要用户知道其中的长度属性是在第5列,不同版本的awk可能会有差异。在PowerShell中的循环也很简单,虽然也需要逐个遍历,但是获取长度属性很方便。因为长度作为文件对象的属性存在,不需要关心其所在列,相似的脚本如下:

PS C:\> get-childitem | measure-object -Property length -Sum
Count    : 53
Average  :
Sum      : 489648208
Maximum  :
Minimum  :
Property : length

其中使用的Measure-Object cmdlet将根据输入的-Property确定要操作的属性,根据输入的选项,如-Sum、-Maximum、-Minimum和-Average对前 面指定的对象属性做求和、求最大值、求最小值,以及求平均值。这里为了和前面的Unix脚本相匹配,只需要指定Length属性及-Sum选项即可。

4  实例:操作动态值

很多由系统提供的对象通常是动态,而不是静态的。即获取某个对象后不需要稍后再次获取其数据,因为该数据根据系统条件的改变不断更新。并且修改这些对象也会立即在系统中生效,此类对象称之为“实时对象”。

例如,需要获取处理器处理时间的占用情况,传统Unix Shell中的ps命令会反复运行以不断取得进程的运行状况。对于能够访问实时进程的对象,只需要获取处理对象一次。一旦对象被系统更新,只需要持续重新 读取相同的属性即可。下例以10秒为间隔获取应用程序占用的内存大小,首先查看Unix Shell脚本的处理方式:

$ while [ true ]
do
msize1=$(ps -el|grep application|grep -v grep|awk '{ print $6}')
sleep 10
msize2=$(ps -el|grep application|grep -v grep|awk '{print $6}')
expr $msize2 - $msize1
msize1=$msize2
done

使用PowerShell操作的方式如下:

PS C:\>> $app = get-process applicationName
PS C:\>> while ( $true ) {
>> $msize1 = $app.VM
>> start-sleep 10
>> $app.VM - $msize1
>> }

显然,PowerShell的脚本更加简单易读。

5  实例:监视进程寿命

如果在Unix下确定特定的进程是否继续在运行,则需要收集进程清单并与另外一个清单对比。例如:

$ processToWatch=$( ps -e | grep application | awk '{ print $1 }'
$ while [ true ]
> do
> sleep 10
> processToCheck=$(ps -e |grep application |awk '{print $1}' )> if [ -z "$processToCheck" -or \> "$processToWatch" != "$processToCheck" ]> then> echo "Process application is not running"> return> fi> done

而在PowerShell下只需要执行下面的操作:

PS C:\> $processToWatch = get-process applicationName
PS C:\> $processToWatch.WaitForExit()

能够看到PowerShell只需获取对象并等待对象退出即可提示。

6  实例:确定软件是否存在预发布的测试版

由于预发布的测试版本往往不稳定,可能存在各种缺陷。从而导致系统安全风险,所以有必要区分此类软件。Unix可执行文件中并不保存此类信息,所以不必讨论Unix Shell下的情况。对于Windows来说,需要特定的工具检查当前运行的进程中是否存在预发布的测试版本。例如:

PS C:\> Get-Process | where  {
>> $_.mainmodule.FileVersioninfo.isPreRelease}
>>
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    627      17    29236       5120   177     7.66    560 Powerword

这个实例使用了层叠的属性,从进程对象(MainModule)中获取的属性中检查。FileVersionInfo属性是MainModle的引用,其属性IsPreRelease是确定软件是否为预发布版本的根据。如果该属性为真,则Get-Process cmdlet输出的对象将会被输出到控制台。

7  实例: 转换字符串大小写

在Unix Shell中通常会用下面的方式转换特定字符串的大小写:

$ echo "this is a string" | tr [:lower:] [:upper:]

或者使用:

$ echo "this is a string" | tr '[a-z]' '[A.Z]'

在PowerShell中则更为简便,如:

PS (1) > "this is a string".ToUpper()

这是直接使用字符串对象的ToUpper()方法转换将字符串中的大写字母转换为小写字母。如果需要将大写字母转换为小写字母,则使用ToLower()方法即可。

8  实例:在字符串中插入字符

例如,需要将字符串“ABC”插入到字符串“string”的首字母之后,得到类似“sABCtring”的字符串。在Unix Shell下使用sed命令:

$ echo "string" | sed "s|\(.\)\(.*)|\1ABC\2|"

在PowerShell中则使用正则表达式:

PS (1) > "string" -replace '(.)(.*)','$1ABC$2'
sABCtring

在PowerShell中更简单的方法是对字符串对象使用Insert()方法直接完成插入操作,如:

PS (2) > "string".Insert(1,"ABC")
sABCtring

PowerShell与Unix Shell对比:八大实例的更多相关文章

  1. Linux/Unix shell 监控Oracle实例(monitor instance)

    使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...

  2. Linux/Unix shell 监控Oracle监听器(monitor listener)

    使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...

  3. Linux/Unix shell 监控Oracle告警日志(monitor alter log file)

    使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...

  4. Cygwin 是一个用于 Windows 的类 UNIX shell 环境

    cygwin的安装使用   Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...

  5. shell及编程实例

    1.shell简介 1) 概念--命令解释器 2) 常见shell bash linux标准shell sh 早期shell,较简单 csh ksh tcsh unix  shell vi  /etc ...

  6. 【转载】Unix Shell中用[-n]判断字符串不为NULL

    转载自:http://blog.sina.com.cn/s/blog_541086430100mosm.html 在Unix Shell中,可以使用-n来判断一个string不是NULL值,但是之前却 ...

  7. Linux/Unix shell 脚本中调用SQL,RMAN脚本

    Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...

  8. Linux/Unix shell sql 之间传递变量

    灵活结合Linux/Unix Shell 与SQL 之间的变量传输,极大程度的提高了DBA的工作效率,本文针对Linux/Unix shell sql 之间传递变量给出几个简单的示例以供参考. Lin ...

  9. Linux/Unix shell 自动发送AWR report(二)

    观察Oracle数据库性能,Oracle自带的awr 功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告.不过awrrpt.sql脚本执行时需要我们提供一些交互信 ...

随机推荐

  1. svn: keywords

    在文件头里面加入下面的关键字: $Date$ $ID$ $Revision$ $Author$ 代码在svn提交时,先选中这几个关键字再提交. Date可能出现中文乱码: 在Control Panel ...

  2. 高级UIKit-02(文件操作)

    [day3_1_Sandbox]:沙箱的介绍 snadbox沙箱沙盒 沙箱根目录下的几个文件夹: 1.应用名称.app存放应用程序的素材 2.Documents:存放应用运行时需要用到的数据(关键性数 ...

  3. JVM调优总结(十二)-参考资料

    能整理出上面一些东西,也是因为站在巨人的肩上.下面是一些参考资料,供大家学习,大家有更好的,可以继续完善:) · Java 理论与实践: 垃圾收集简史 · Java SE 6 HotSpot[tm] ...

  4. ORA-19815,ORA-19809 :limit exceeded for recovery files

    数据库重新启动的时候,收到了ORA-19815的错误.从错误的提示来看,是由于闪回区的空间被填满导致无法成功启动.这种情形我们通常考虑的是清除归档日志,那就直接在OS层面rm了,真的是这样吗?客官,如 ...

  5. AT&T汇编

    AT&T汇编和8086汇编语言虽然两者很相似,但是还是不能根据8086的语法规则来读AT&T汇编的吧,所以还是要看看AT&T汇编的语法规则,因为在读内核代码时,跟硬件打交道的部 ...

  6. 用 PS 复制权限

    用 PS 复制权限 我们要把源计算机上的文件权限复制到目的计算机上. get-acl .\s.txt | Export-Clixml sddl.xml 把 s.txt 文件的权限保存到 sddl.xm ...

  7. UI_UIImageView 基本操作

    UI_UIImageView 经常用法 // 使用ImageView 通过 name 找到图片 UIImage *image = [UIImage imageNamed:@"bg_2&quo ...

  8. SPField的GetValidatedString方法没有被调用

    当我们开发自定义类型的Field时,可能会用到GetValidatedString这个方法. 但是有时候这个方法并没被调用 原因是: 当Field的Value为null时,该方法不会被调用 解决办法: ...

  9. perl 访问类方法的几种方式

    [root@wx03 test]# cat Horse.pm package Horse; use base qw(Critter); sub new { my $invocant = shift; ...

  10. JavaWeb图表插件的小研究

    背景 近期的一个项目中,对数据的统计分析有非常大的要求,这就要求有一款非常强大的报表.图表插件.因此,组长给分了任务.让我们各自去研究不同的图表插件.用了一两天的时间,对java这块的图表插件做了一个 ...