2009-11-09 15 views
11

Tengo la siguiente entrada de registro que estoy procesando en PowerShell Estoy tratando de extraer todos los nombres de actividad y duraciones usando el operador -match pero solo estoy recuperando un grupo de coincidencia. No obtengo todas las coincidencias que veo cuando hago lo mismo en C# usando el objeto Regex. ¿Alguien puede explicar lo que estoy haciendo mal?PowerShell - operador de concordancia y múltiples grupos

Relevante PowerShell Guión

$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 

salida

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

Ejemplo de registro de entrada:

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) 

Respuesta

9

Usted puede hacer esto con el cmdlet Select-String en V2, pero es necesario especificar los -AllMatches interruptor por ejemplo:

$formattedMessage | Select-String 'regexpattern' -AllMatches 

Tenga en cuenta que con el operador -match la cosa principal que está doing busca una coincidencia "a", es decir, el patrón de expresiones regulares coincide o no.

9

yo era capaz de conseguir todos los grupos mediante la definición de una expresión regular y luego llamar. Coincide con ese Regex. Todavía tengo curiosidad por saber si esto se puede hacer con el operador -match en PowerShell.

$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

mejor respuesta, le permite asignar su resultado a una variable muy fácilmente para que pueda manejarlo como una matriz de coincidencias. – sonjz

4

El operador -match está destinado a ser utilizado una sola vez; no hace una coincidencia global en la entrada. Keith Hill sugirió un operador -matchall en Microsoft connect here.

Voy a sugerir otra forma de hacerlo. Si la entrada de registro se encuentra en un archivo, puede utilizar la instrucción switch para realizar la misma cosa:

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

Ésta es la salida me sale con esta afirmación si $entryRegex tiene la expresión regular que ha definido:

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 da un ejemplo decente

Y, por supuesto, simplificar su expresión:

^([^-]+)\s*-\s*duration\(([0-9]+) 
  • inicio al comienzo de la línea
  • captura de todos los personajes que llevaron a la primera -
  • asegurarse de que hay una -
  • saltar espacios en blanco
  • asegurarse de que la palabra "duración (" existe
  • captura de todos los dígitos después de "duración ("
+0

Intenté simplificar la expresión regular como describiste (antes de crear la desagradable que tengo allí) y powershell no genera ninguna coincidencia. –

+0

Tomé sus datos de muestra y obtenía los resultados adecuados con la expresión exacta anterior. – genio

+0

powershell generará coincidencias utilizando la expresión regular proporcionada –

0

puede incluir Regular Expression Options en una expresión, pero, lamentablemente, Global no parece ser una de las opciones disponibles.

Cuestiones relacionadas