PowerShell 2.0 CTP:使用Select-String查找文本

注:本篇文章,未在联系作者以及得到许可的情况下, 禁止以任何形式进行转载。

By:Anders      Mail:katrina520@163.com 



使用Select-String查找文本

 最近社区技术预览版( CTP )谈论最多的焦点是内置在Windows PowerShell 2.0新的远程访问功能。并有一个正当的理由:对于以运行powershell命令和powershell cmdlets来远程计算机这一背景而言这是相当地酷的功能。事实是,即使PowerShell上仅仅做了些改变,这也将有足够的理由去下载新发布的CTP版 。然而现在的情况是,powershell 2.0包括其他一些新的特点,从全新的工作在WMI上的cmdlets的小改进现有cmdlets 。和现有的cmdlets一样,也就是说Select-String cmdlet 。

Select String cmdlet是用来寻找目标文本内部的一个文件或一个变量值。例如,假设我们以一个文本文件名来保存了这篇文章的第一个段落。
C:/Scripts/Test.txt. 现在,假设我们需要知道这个文件是否包含目标字符串CTP 。在C:/Scripts/Test.txt里的任何位置里我们又如何能够确定是否存在字符串CTP呢? 像这样做:

Select - String C:/Scripts/Test.txt  - pattern  " CTP "

你可以看到,这是一个很简单的命令:我们只要按照 Select-String的标准: 1)在项目上我们想要搜索的数据(C:/Scripts/Test.txt);  以及  2)模式参数(用于具体目标文本,这个值就是我们正在搜索的) 。作为回报,Select-String 会返回它发现所相匹配的:

C:/scripts/Test.txt: 2 :about feature of the recent Community Technology Preview (CTP) release. And  for  good reason:
C:/scripts/Test.txt:
5 :would be reason enough to download the CTP release. As it  is , however, PowerShell  2.0  includes

只要我们在这个问题上,我们就应该指出,Select-String报告返回文件的路径,行数,和在文本文件的目标值中发现实际路径。在某些情况下,可能你需要借助更多的信息,或许你所需要的是行数。在这种情况下,你可以用管道在Select-Object cmdlet后输出并只要选择几个属性( FilePath , LineNumber ,Line) ,你感兴趣的:

Select - String C:/Scripts/Test.txt  - pattern  " CTP "   |  Select - Object LineNumber

或者,附加一个 -quiet参数,并获得一个布尔值(真或假),这将告诉你目标文本是否至少有一个实例对象会被发现:

Select - String C:/Scripts/Test.txt  - pattern  " CTP "   - quiet

和他自己,这是非常酷的!但在powershell 2.0中有若干个新的参数,已被列入Select-String,我们将在这篇文章中探讨关于包括的两个参数: -notMatch和-context。让我们来看看,如果我们可以领会出这两个参数做法。

-notMatch 参数

Select-String的最初目的是为了在匹配发生时获得所有的实例(例如,一个文本文件内的全文本)。不过,在所有情况下可能有时当你感兴趣的仍旧不可能发生。例如,假设你有一个非常简单的文本文件(C:/Scripts/Test.txt) ,看起来就像这样:

Failed
Failed
Succeeded
Postponed
Failed
Succeeded
Succeeded
Postponed
Failed

你可以看到,在这里我们有几个不同的方案:失败,成功,并且是推迟的。假设你想在所有的行数中获得Failed单词这一信息。这做起来足够简单:

Select-String C:/Scripts/test.txt -pattern "failed"

唔,但是如果你想要文本文件全文本中不包含Failed单词的信息?在Windows PowerShell 1.0 ,要获得那些信息并没有简单的方法。
然而,在Windows PowerShell 2.0,还有一个非常简单的方法来获得那些信息:

Select-String C:/Scripts/test.txt -pattern "failed" -notMatch

这里看到我们所做的了吗?我们使用Select-String来搜索Test.txt中所有包含Failed的单词。不过,我们也可以附加 -notMatch参数,这样就告诉了该cmdlet返回文本文件全文本中不包含目标单词的信息。或者换句话说, -notMatch告诉脚本返回的信息是这样的:

scripts/test.txt:3:Succeeded
scripts/test.txt:4:Postponed
scripts/test.txt:6:Succeeded
scripts/test.txt:7:Succeeded
scripts/test.txt:8:Postponed

正如你所看到的,我们获得的仅仅是文本文件全文中不包含failed单词的信息。而这正是我们一直希望所要获得的。

 

-context 参数

有时搜索一个目标值,能够很快速的输出。举例来说,假设你用这个命令在一个日志文件中搜索单词failure:

(译者注:英文原文将Test.txt误写成为Test.lxt,这里译者已修改 )

Select-String C:/Scripts/Test.txt -pattern "failure"

现在,假设Select-String返回的报告如下:

scripts/test.txt:4:a) Name Resolution failure on the current domain controller.

对当前的域控制器名字解析失败?唔,哦,警铃响了!

但是等等。不过现在看来,进入这个日志文件内所读到的(部分)是这样的:

Processing Failed 10/30/2007 10:04:05 AM
The processing of Group Policy did not succeed. Windows could not resolve the
computer name. This could be caused by one or more of the following:
a) Name Resolution failure on the current domain controller.
b) Active Directory Replication Latency (an account created on another
domain controller has not replicated to the current domain controller).

换句话说,你可能有一个名字解析失败。但是,再说,也许这几个不是其中几个可能的问题。

这就是说,在一个文本文件中提取信息这可能非常重要。这也算是不错了,因为一些上下文文本中仅仅靠Select-String cmdlets是根本不能提供的。

那么,除非你使用-context参数。

顾名思义,-context参数不仅能发现相匹配的,而且也可以让你查看在上下文中相匹配的。那太棒了。但是,这是否能精确的表明?

为了回答这个问题,让我们修改我们之前加入的-context参数:

(译者注:英文原文将Test.txt误写成为Test.lxt,这里译者已修改 )

Select-String C:/Scripts/Test.txt -pattern "failure" –context 2

把2传递给-context?这仅仅是告诉脚本,当谈到以显示任何匹配的次数,我们不希望看到只在一行文字的地方发生匹配。相反,我们还希望立即看到两行文字以及下面一行立即接着的两行文字。或者换句话说,我们想要输出看起来像这样的(注:右直角识别了会发生匹配的这行[>]):

  scripts/test.txt:2:The processing of Group Policy did not succeed. Windows could not resolve the
  scripts/test.txt:3:computer name. This could be caused by one or more of the following:
> scripts/test.txt:4:a) Name Resolution failure on the current domain controller.
  scripts/test.txt:5:b) Active Directory Replication Latency (an account created on another
  scripts/test.txt:6:domain controller has not replicated to the current domain controller).

这样看起来更象些,现在我们知道,虽然我们可能有一个failure名字解析失败,我们也可能还会有一些其他的问题(例如,活动目录复制问题) 。能节约我们追求问题而所花费了大量的时间和精力,甚至不需要。

如果你愿意,在当前的行上你可以指定不同的值来匹配并且接着一个匹配。举例来说,这个命令表明了我们立即匹配一行之前的三行,以及刚才那一行立即接着下一行的匹配:

Select-String C:/Scripts/Test.lxt -pattern "failure" –context 3,1

用我们的样文为例,输出结果看起来就像这样:

  scripts/test.txt:1:Processing Failed 10/30/2007 10:04:05 AM
  scripts/test.txt:2:The processing of Group Policy did not succeed. Windows could not resolve the
  scripts/test.txt:3:computer name. This could be caused by one or more of the following:
> scripts/test.txt:4:a) Name Resolution failure on the current domain controller.
  scripts/test.txt:5:b) Active Directory Replication Latency (an account created on another

 

很不错。

奖励一个Select-String提示。默认情况下,Select-String是不区分大小写匹配的;这意味着该字母的情况是不被重视的,这反过来也意味着,无论FAILURE与failure将像同样的名称一样被匹配。如果你更愿意使之区分大小写匹配,让FAILURE与failure不一样被匹配,那么可以简单地加上 -caseSensitive 参数。

 

 

英文原文:http://www.microsoft.com/technet/scriptcenter/topics/winpsh/selectstring.mspx


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值