如何在PowerShell中搜索包含2个模式的字符串?

时间:2014-05-08 19:44:57

标签: powershell

我正在尝试在日志文件中搜索必须包含2个模式的字符串,单词“down”和特定日期,但它们在字符串中并不是彼此相邻的。到目前为止我尝试过的所有东西都已经下降或者是日期,但不一定都是。就像我说的那样,我希望字符串只有两者兼而有之。我该怎么做呢?最好在powershell命令行中?

2 个答案:

答案 0 :(得分:1)

这是一个关于如何做到这一点的微软博客technet的链接。 powershell documentation

使用-pattern来分隔模式。 -pattern对模式

使用字符串或正则表达式

您还需要将-path添加到日志文件

C:/> select-string -path path/to/file/logname.log -pattern "text or regex"

如果你有超过1个日志使用这个

C:/> select-string -path path/to/file/*.log -pattern "text or regex"

答案 1 :(得分:1)

嗯,我知道有几种方法可以解决这个问题。 RegEx的方式,以及另一种方式。首先是简单的方法...... (我不知道你的约会对象,所以我使用的是5/4/13)

GC $LogFile | ?{ $_ -match "down" -and $_ -match "5/4/13" }

然后使用RegEx,您可以执行以下操作:

GC $LogFile | ?{ $_ -match "(down).*?(5/4/13)" }

因此,查找单词“down”后跟任意数量的字符,后跟“5/4/13”。唯一可能令人困惑的是.*?部分。正则表达式中的点匹配除新行或回车符之外的任何字符。 *表示零个或多个这些字符,并且?意味着它不会超过下一个匹配项目之前所需的时间(在这种情况下为5/14/13)。如果日期是第一个,您可以撤销订单。如果您不知道订单,那么请使用选项1或在RegEx找到比我更好的人。它可以在不知道顺序的情况下完成,但我不记得是因为我从未使用过它。

编辑好的,我发现了RegEx我在考虑,因为Frode的评论让我意识到这是我应该知道的,因为它总的来说更好,而且它让我不知道。所以......

更新了RegEx选项!这将搜索单词“down”和日期“5/4/13”,无论它们处于哪个顺序,如果找到一个,它将仅查找另一个作为其第二个匹配。所以它会匹配"down <other text> 5/4/13""5/4/13 <other text> down"

-match "(down|(5/4/13)).*?(?(2)down|5/4/13)"

请参阅我运行它的这些示例:

PS C:\> "5/4/13 - SQLSrvr17 went down" -match "(down|(5/4/13)).*?(?(2)down|5/4/13)"
True

PS C:\> "There was downtime on server2 on 5/4/13" -match "(down|(5/4/13)).*?(?(2)down|5/4/13)"
True

PS C:\> "The downtime was due to server 3 being down" -match "(down|(5/4/13)).*?(?(2)down|5/4/13)"
False

PS C:\> "5/4/13 is 5/4/13" -match "(down|(5/4/13)).*?(?(2)down|5/4/13)"
False

日志文件的用法是:

GC Logfile.log | ?{ $_  -match "(down|(5/4/13)).*?(?(2)down|5/4/13)" }

如果该日志文件包含我测试的4行,那么结果将是:

5/4/13 - SQLSrvr17 went down
There was downtime on server2 on 5/4/13