Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在powershell中搜索具有2种模式的字符串?_Powershell - Fatal编程技术网

如何在powershell中搜索具有2种模式的字符串?

如何在powershell中搜索具有2种模式的字符串?,powershell,Powershell,我试图在日志文件中搜索一个字符串,该字符串必须包含两种模式,即单词“down”和特定日期,但它们在字符串中并不相邻。到目前为止,我尝试过的每件事要么是失败,要么是日期,但不一定两者都是。就像我说的,我想要两个都有的字符串。我该怎么做呢?最好是在powershell命令行中 这里有一个微软博客technet的链接,关于如何做到这一点 使用-pattern来分隔模式-模式使用字符串或正则表达式作为模式 您还需要将-path添加到日志文件中 C:/> select-string -path pa

我试图在日志文件中搜索一个字符串,该字符串必须包含两种模式,即单词“down”和特定日期,但它们在字符串中并不相邻。到目前为止,我尝试过的每件事要么是失败,要么是日期,但不一定两者都是。就像我说的,我想要两个都有的字符串。我该怎么做呢?最好是在powershell命令行中

这里有一个微软博客technet的链接,关于如何做到这一点

使用-pattern来分隔模式-模式使用字符串或正则表达式作为模式

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

C:/> select-string -path path/to/file/logname.log -pattern "text or regex"
如果您有多个日志,请使用此

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

我知道有两种方法可以解决这个问题。RegEx方式,另一种方式。首先是简单的方法。。。 (我不知道你的日期,所以我用的是5/4/13)

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

GC $LogFile | ?{ $_ -match "(down).*?(5/4/13)" }
因此,这将查找单词“down”,后跟任意数量的字符,后跟“5/4/13”。唯一可能令人困惑的是
*?
部分。正则表达式中的点与除新行或回车符以外的任何字符匹配。*表示这些字符中的零个或多个,而?意味着在下一个比赛项目(本例中为5/14/13)之前,所需时间不会超过所需时间。如果日期先到,则颠倒顺序。如果你不知道顺序,那么使用选项1或者找一个比我更好的正则表达式。它可以在不知道顺序的情况下完成,但我不记得是怎么做的,因为我自己从未使用过

编辑:好的,我找到了我正在考虑的正则表达式,因为Frode的评论让我意识到这是我应该知道的,因为它总的来说更好,它让我不知道。所以

更新的正则表达式选项!这将搜索单词“down”和日期“5/4/13”,无论它们的顺序如何,如果找到一个,它将只查找另一个作为第二个匹配项。因此它将匹配
“向下5/4/13”
“向下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)" }
5/4/13 - SQLSrvr17 went down
There was downtime on server2 on 5/4/13
如果该日志文件包含我针对结果测试的4行,则结果将是:

GC Logfile.log | ?{ $_  -match "(down|(5/4/13)).*?(?(2)down|5/4/13)" }
5/4/13 - SQLSrvr17 went down
There was downtime on server2 on 5/4/13

您能否发布一个您正在尝试匹配的字符串的示例,以及您迄今为止尝试过的内容?要支持这两种情况,请尝试:
(向下)。*?(5/4\/13)|(5/4/13)。*?(向下)
。您应该详细说明。使用源代码很好,但是您可以引用文本或使用
Select String
:-)显示示例我并不是想就此给出答案。这是学习通过反复试验来发现答案的一部分。我将他/她与完成此任务所需的工具联系起来。*更新并添加了示例。该文件提供了示例供参考。