2010-10-13 10 views
19

मैं निर्देशिका में फ़ाइलों में एक से अधिक स्ट्रिंग खोजना चाहता हूं, हालांकि "select-string -pattern" का उपयोग करने में मदद नहीं मिली। क्या कोई मुझे दिखा सकता है कि यह कैसे करें?फ़ाइल में एक से अधिक पैटर्न खोजने के लिए PowerShell select-string का उपयोग कैसे करें?

उदाहरण: सी: \ लॉग्स में सभी फाइलें खोजें जिनमें "विक्रेता पूछताछ" और "असफल" शब्द और लॉगटाइम के साथ 11:30 बजे शामिल हैं। फाइलों का ढांचा भिन्न हो सकता है (उदा। विभिन्न टैग नाम, आदि):

... <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> ... 

धन्यवाद।

उत्तर

0

शक्तियों में regex का उपयोग करने के बारे में कैसे?

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

XML पार्सिंग एक बेहतर समाधान हो सकता है। http://thepowershellguy.com/blogs/posh/archive/2007/12/30/processing-xml-with-powershell.aspx

+0

मैं XML पार्सिंग का उपयोग नहीं करना चाहते हैं की वजह से भारी लॉग फ़ाइलों के लिए बहुत धीमी गति से प्रदर्शन। मुझे कुछ तेज़ चाहिए। रेगेक्स अच्छा है हालांकि मुझे नहीं पता कि मैं उस अभिव्यक्ति को कैसे लिख सकता हूं जो उस फ़ाइल में खोज करता है जहां एक शब्द वेंडरएक्विरी और असफल मौजूद है। – Thomas

22

आप या तो आदेश, उपयोग में दो शब्दों से मेल करना चाहते हैं:

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

हमेशा विफल आता VendorEnquiry के बाद लाइन पर हैं, तो बस का उपयोग करें:

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

को खोजने के लिए प्रत्येक फ़ाइल में कई मैचों, हम कई चयन-स्ट्रिंग कॉल अनुक्रमित कर सकते हैं:

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

प्रत्येक चरण में, जिन फ़ाइलों में वर्तमान पैटर्न नहीं है, उन्हें फ़िल्टर किया जाएगा, यह सुनिश्चित करने के लिए कि फ़ाइलों की अंतिम सूची में सभी खोज शब्द शामिल हैं।

बल्कि मैन्युअल रूप से प्रत्येक का चयन-स्ट्रिंग कॉल बाहर लिखने की तुलना में, हम कई प्रतिमानों से मिलान करने के लिए एक फिल्टर के साथ इस आसान बनाने में कर सकते हैं:

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',... 


अब, "Logtime 11:30 के बारे बजे" को पूरा करने के भाग उदाहरण के लिए प्रत्येक विफलता प्रविष्टि के अनुरूप लॉग समय खोजने की आवश्यकता होगी। इस फ़ाइलों की वास्तविक संरचना पर बहुत निर्भर है, लेकिन "के बारे में" के लिए परीक्षण करने के लिए कैसे अपेक्षाकृत सरल है:

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 
संबंधित मुद्दे