2010-10-13 27 views
19

Tôi muốn tìm kiếm nhiều hơn một chuỗi trong các tệp trong một thư mục, tuy nhiên việc sử dụng "select-string -pattern" không hữu ích. Bất cứ ai có thể chỉ cho tôi làm thế nào để làm điều đó?Cách sử dụng chuỗi chọn PowerShell để tìm nhiều hơn một mẫu trong một tệp?

Ví dụ: Tìm kiếm tất cả các tệp trong C: \ Nhật ký có chứa từ "VendorEnquiry" và "Không thành công" và với khoảng thời gian Logtime khoảng 11:30 sáng. Cấu trúc của các file có thể khác nhau (ví dụ tên khác nhau thẻ, vv):

... <methodException>VendorEnquiry</methodException> ... 
... <logTime>13/10/2010T11:30:04 am</logTime> ... 
... <status>Failed</status> ... 

... <serviceMethodException>VendorEnquiry</serviceMethodException> ... 
... <logTime>13/10/2010</logTime> ... 
... <serviceStatus>Failed</serviceStatus> ... 

Cảm ơn.

Trả lời

0

Làm thế nào về việc sử dụng regex trong PowerShell?

http://powershell.com/cs/blogs/ebook/archive/2009/03/30/chapter-13-text-and-regular-expressions.aspx

Phân tích cú pháp XML có thể là giải pháp tốt hơn. http://thepowershellguy.com/blogs/posh/archive/2007/12/30/processing-xml-with-powershell.aspx

+0

Tôi không muốn sử dụng phân tích cú pháp xml gây ra hiệu suất rất chậm cho tệp nhật ký lớn. Tôi muốn cái gì đó nhanh. Regex là tốt tuy nhiên tôi không biết làm thế nào tôi có thể viết biểu thức tìm kiếm trong tập tin mà có một từ VendorEnquiry và không tồn tại. – Thomas

22

Nếu bạn muốn kết hợp hai từ trong hoặc trật tự, sử dụng:

gci C:\Logs| select-string -pattern '(VendorEnquiry.*Failed)|(Failed.*VendorEnquiry)' 

Nếu Không luôn đứng sau VendorEnquiry trên đường dây, chỉ cần sử dụng:

gci C:\Logs| select-string -pattern '(VendorEnquiry.*Failed)' 
16

Để tìm kiếm nhiều kết quả phù hợp trong mỗi tệp, chúng tôi có thể sắp xếp một số cuộc gọi Chọn Chuỗi:

Get-ChildItem C:\Logs | 
    where { $_ | Select-String -Pattern 'VendorEnquiry' } | 
    where { $_ | Select-String -Pattern 'Failed' } | 
    ... 

Ở mỗi bước, các tệp không chứa mẫu hiện tại sẽ được lọc ra, đảm bảo rằng danh sách tệp cuối cùng chứa tất cả các cụm từ tìm kiếm.

Thay vì viết ra mỗi cuộc gọi Chọn-String bằng tay, chúng ta có thể đơn giản hóa này với một bộ lọc để phù hợp với nhiều mô hình:

filter MultiSelect-String([string[]]$Patterns) { 
    # Check the current item against all patterns. 
    foreach($Pattern in $Patterns) { 
    # If one of the patterns does not match, skip the item. 
    $matched = @($_ | Select-String -Pattern $Pattern) 
    if(-not $matched) { 
     return 
    } 
    } 

    # If all patterns matched, pass the item through. 
    $_ 
} 

Get-ChildItem C:\Logs | MultiSelect-String 'VendorEnquiry','Failed',... 


Bây giờ, để đáp ứng các "Logtime khoảng 11:30" phần của ví dụ sẽ yêu cầu tìm thời gian đăng nhập tương ứng với mỗi lần nhập thất bại. Cách thực hiện điều này phụ thuộc nhiều vào cấu trúc thực của các tệp, nhưng việc kiểm tra "about" tương đối đơn giản:

function AboutTime([DateTime]$time, [DateTime]$target, [TimeSpan]$epsilon) { 
    $time -le ($target + $epsilon) -and $time -ge ($target - $epsilon) 
} 

PS> $epsilon = [TimeSpan]::FromMinutes(5) 
PS> $target = [DateTime]'11:30am' 
PS> AboutTime '11:00am' $target $epsilon 
False 
PS> AboutTime '11:28am' $target $epsilon 
True 
PS> AboutTime '11:35am' $target $epsilon 
True 
Các vấn đề liên quan