簡體   English   中英

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

[英]How do I search for a string with 2 patterns in powershell?

我正在嘗試在日志文件中搜索必須包含2個模式的字符串,單詞“down”和特定日期,但它們在字符串中不是彼此相鄰的。 到目前為止我嘗試過的所有東西都已經下降或者是日期,但不一定都是。 就像我說的那樣,我希望字符串只有兩者兼而有之。 我該怎么做呢? 最好在powershell命令行中?

這是一個關於如何做到這一點的微軟博客technet的鏈接。 powershell文檔

使用-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"

好吧,我知道有幾種方法可以解決這個問題。 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM