我有許多由 IMAPSync 行程生成的日志檔案。每個郵箱都有一個已同步的日志檔案。
我需要識別所有具有特定字串的日志檔案。
目前我有
Get-ChildItem -Filter *.txt | select-string 'Quota exceeded'
這會盡職盡責地列印出包含該字串的所有行,該字串可以在日志檔案中多次出現。當腳本遇到第一個匹配項并進入下一個專案并僅列印檔案名時,我所追求的腳本是“停止”。
例如,如果我有 3 個檔案:
Fu.txt
Bar.txt
Baz.txt
每個都有 10,000 行,并且在 Bar.txt 中,其中 3,000 行具有“超出配額” - 我想要從腳本中得到的只是輸出:
Bar.txt
與目前相反,我有一個充滿結果的 shell 視窗。
uj5u.com熱心網友回復:
switch將 a與引數一起使用-File而不是可能更有效Select-String,例如,如果通配符模式匹配一??次,則下面將輸出檔案的絕對路徑,然后繼續下一個檔案。
Get-ChildItem -Filter *.txt -PipelineVariable dir | ForEach-Object {
switch -Wildcard -File ($_.FullName) {
'*Quota exceeded*' { return $dir.FullName }
}
}
使用-List引數 forSelect-String也可能是一個很好的可能性,但是我傾向于上面的例子。
-List
每個輸入檔案只回傳匹配文本的第一個實體。這是檢索內容與正則運算式匹配的檔案串列的最有效方法。
(Select-String -Path *.txt -SimpleMatch -List -Pattern 'Quota exceeded').Path
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/444130.html
