2009-11-09 64 views
11

我有我在PowerShell中我處理我試圖提取所有活動名稱以及使用-match操作的持續時間,但我只得到一個比賽組回以下日誌項。我沒有得到的一切,我看到的時候我使用Regex對象做同樣的事情在C#中的比賽。有人能解釋我做錯了什麼嗎?的PowerShell -match運算和多組

相關PowerShell腳本

$formattedMessage -match "(Get\sClient\sModel|Parse\sExpression|Get\sAbstract\sQuery|Compile\sQuery|Execute\sQuery|Get\sQuery\sPlan\sComplexity|Async\sTotal|Total)\s-\sduration\(([0-9]*)" | out-null 
$matches 

輸出

Name Value 
---- ----- 
0  Get Client Model - duration(0 
1  Get Client Model 
2  0 

日誌條目示例:

Timestamp: 11/9/2009 6:48:41 PM 
Message: 
Category: QueryService 
Priority: 3 
EventId: 1001 
Severity: Information 
Title: SPARQL Query Response 
Machine: SPOON16-SERVER 
App Domain: KnowledgeBaseHost.exe 
ProcessId: 2040 
Process Name: D:\QueryService\QSHost.exe 
Thread Name: 
Win32 ThreadId:8092 
Extended Properties: 
Key - Workflow_cbbdd58b-e574-4054-88d4-1dd7a56dc9d9 
Timeout - 1800 
Result Format - WireTable 
Result from Registry - False 
Compiled Query from Cache - True 
Result Count - 28332 
Query Plan Complexity - 661622 
Get Client Model - duration(0) start(0) 
Parse Expression - duration(0) start(0) 
Get Abstract Query - duration(0) start(0) 
Compile Query - duration(0) start(0) 
Get Query Plan - duration(0) start(1) 
Execute Query - duration(63695) start(1) 
Get Query Plan Complexity - duration(0) start(63696) 
Get Executed Operations - duration(0) start(63696) 
Total - duration(63696) start(0) 
Async Total - duration(63696) start(0) 

回答

9

你可以做到這一點,在V2選擇字符串cmdlet的,但你需要指定-AllMatches切換如:

$formattedMessage | Select-String 'regexpattern' -AllMatches 

請記住,與-match運營商的首要事情是你正在尋找「a」匹配,即正則表達式匹配與否。

9

我能夠通過定義一個正則表達式,然後調用把所有的羣體。匹配那個正則表達式。仍然很想知道這是否可以用PowerShell中的-match運算符來完成。

$detailRegex = [regex]"(Get\sClient\sModel|Parse\sExpression|Get\sAbstract\sQuery|Compile\sQuery|Execute\sQuery|Get\sQuery\sPlan\sComplexity|Async\sTotal|Total)\s-\sduration\(([0-9]*)" 
$detailRegex.Matches($formattedMessage) 
+0

最佳答案,讓您能夠將結果分配給一個變量很容易使你可以處理它作爲一個匹配的數組。 – sonjz 2014-06-12 17:11:34

4

-match運算符是指只使用一次;它不會在輸入上進行全局匹配。基思·希爾提出的建議對微軟-matchall接線員here

我會建議另一種方式來做到這一點。如果日誌條目是在一個文件中,你可以使用switch語句來完成同樣的事情:

switch -regex -file .\log.txt { $entryRegex { $matches[1] + ", " + $matches[2] } } 

這是輸出我這個說法得到,如果$entryRegex有你所定義的正則表達式:

Get Client Model, 0 
Parse Expression, 0 
Get Abstract Query, 0 
Compile Query, 0 
Execute Query, 63695 
Get Query Plan Complexity, 0 
Total, 63696 
Async Total, 63696 
4

http://www.johndcook.com/regex.html給出了一個體面的例子

而且,通過各種手段,簡化您的表情:

^([^-]+)\s*-\s*duration\(([0-9]+) 
  • 開始在該行
  • 捕獲的開始領先到第一個所有字符 -
  • 確保有一個 -
  • 跳過空白
  • 確保單詞「期間(」存在
  • 捕獲後所有的數字「持續時間(」
+0

我試着按照你所描述的方式簡化了正則表達式(之前創建了我在那裏討厭的那個),並且powershell不會生成任何匹配。 – 2009-11-09 23:02:37

+0

我拿了您的樣本數據,並得到正確的結果與上面的確切表達式。 – genio 2009-11-10 14:14:14

+0

powershell將使用提供的正則表達式來生成匹配 – 2009-11-10 15:35:01