[英]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.