PowerShell与Unix Shell对比:八大实例
PowerShell与Unix Shell对比:八大实例
本文将从八个实例对比PowerShell和Unix Shell,通常是Linux Bourne Shell(包括sh、ksh和bash等)。二者存在非常大的差异,最大不同是PowerShell将对象作为基本的操作单元,而Unix Shell将字符串作为基本单元。相似之处是二者均有数量巨大内置命令,而且允许用户扩展。
本文将举例对比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对比:八大实例的更多相关文章
- Linux/Unix shell 监控Oracle实例(monitor instance)
使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...
- Linux/Unix shell 监控Oracle监听器(monitor listener)
使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...
- Linux/Unix shell 监控Oracle告警日志(monitor alter log file)
使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...
- Cygwin 是一个用于 Windows 的类 UNIX shell 环境
cygwin的安装使用 Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...
- shell及编程实例
1.shell简介 1) 概念--命令解释器 2) 常见shell bash linux标准shell sh 早期shell,较简单 csh ksh tcsh unix shell vi /etc ...
- 【转载】Unix Shell中用[-n]判断字符串不为NULL
转载自:http://blog.sina.com.cn/s/blog_541086430100mosm.html 在Unix Shell中,可以使用-n来判断一个string不是NULL值,但是之前却 ...
- Linux/Unix shell 脚本中调用SQL,RMAN脚本
Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...
- Linux/Unix shell sql 之间传递变量
灵活结合Linux/Unix Shell 与SQL 之间的变量传输,极大程度的提高了DBA的工作效率,本文针对Linux/Unix shell sql 之间传递变量给出几个简单的示例以供参考. Lin ...
- Linux/Unix shell 自动发送AWR report(二)
观察Oracle数据库性能,Oracle自带的awr 功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告.不过awrrpt.sql脚本执行时需要我们提供一些交互信 ...
随机推荐
- svn: keywords
在文件头里面加入下面的关键字: $Date$ $ID$ $Revision$ $Author$ 代码在svn提交时,先选中这几个关键字再提交. Date可能出现中文乱码: 在Control Panel ...
- 高级UIKit-02(文件操作)
[day3_1_Sandbox]:沙箱的介绍 snadbox沙箱沙盒 沙箱根目录下的几个文件夹: 1.应用名称.app存放应用程序的素材 2.Documents:存放应用运行时需要用到的数据(关键性数 ...
- JVM调优总结(十二)-参考资料
能整理出上面一些东西,也是因为站在巨人的肩上.下面是一些参考资料,供大家学习,大家有更好的,可以继续完善:) · Java 理论与实践: 垃圾收集简史 · Java SE 6 HotSpot[tm] ...
- ORA-19815,ORA-19809 :limit exceeded for recovery files
数据库重新启动的时候,收到了ORA-19815的错误.从错误的提示来看,是由于闪回区的空间被填满导致无法成功启动.这种情形我们通常考虑的是清除归档日志,那就直接在OS层面rm了,真的是这样吗?客官,如 ...
- AT&T汇编
AT&T汇编和8086汇编语言虽然两者很相似,但是还是不能根据8086的语法规则来读AT&T汇编的吧,所以还是要看看AT&T汇编的语法规则,因为在读内核代码时,跟硬件打交道的部 ...
- 用 PS 复制权限
用 PS 复制权限 我们要把源计算机上的文件权限复制到目的计算机上. get-acl .\s.txt | Export-Clixml sddl.xml 把 s.txt 文件的权限保存到 sddl.xm ...
- UI_UIImageView 基本操作
UI_UIImageView 经常用法 // 使用ImageView 通过 name 找到图片 UIImage *image = [UIImage imageNamed:@"bg_2&quo ...
- SPField的GetValidatedString方法没有被调用
当我们开发自定义类型的Field时,可能会用到GetValidatedString这个方法. 但是有时候这个方法并没被调用 原因是: 当Field的Value为null时,该方法不会被调用 解决办法: ...
- perl 访问类方法的几种方式
[root@wx03 test]# cat Horse.pm package Horse; use base qw(Critter); sub new { my $invocant = shift; ...
- JavaWeb图表插件的小研究
背景 近期的一个项目中,对数据的统计分析有非常大的要求,这就要求有一款非常强大的报表.图表插件.因此,组长给分了任务.让我们各自去研究不同的图表插件.用了一两天的时间,对java这块的图表插件做了一个 ...