2015-04-24 2 views
6

Una domanda abbastanza semplice, spero.Powershell ignora lo sguardo dietro l'espressione regolare per restituire l'intera riga

Ho un file di log di testo che include la seguente riga:

123,010502500114082000000009260000000122001T

voglio per la ricerca in file di registro e tornare alla sezione "00.000.000,926 mila" del testo di cui sopra . Quindi ho scritto un'espressione regolare: = 123. {17}). {11}

Quindi quando l'aspetto dietro il testo è uguale a "123" con 17 caratteri, restituire il successivo 11. Funziona correttamente quando viene testato sugli editor regex online. Comunque in Powershell viene restituita l'intera riga invece degli 11 caratteri che voglio e non riesco a capire perché.

$InputFile = get-content logfile.log 
$regex = '(?<=123.{17}).{11}' 
$Inputfile | select-string $regex 

(viene restituita l'intera riga).

Perché PowerShell restituisce l'intera linea?

risposta

5

È perché si utilizza Select-String che restituisce la riga corrispondente (si pensi a grep).

$InputFile = get-content logfile.log | ForEach-Object { 
    if ($_ -match '(?<=123.{17})(.{11})') { 
     $Matches[1] 
    } 
} 

Non testato, ma dovrebbe funzionare (o qualcosa di simile).

+0

Ha senso e utilizza -match invece di select-string lavorate. Grazie per l'aiuto. – user3046742

5

Non sconto Select-String ancora. Come Briantist dice che sta facendo quello che vuoi a ma hai bisogno di estrarre i dati che hai in realtà vuoi in due modi. Select-String restituisce oggetti Microsoft.PowerShell.Commands.MatchInfo e non solo stringhe non elaborate. Inoltre, useremo la capacità di Select-String di prendere direttamente l'input del file.

$InputFile = "logfile.log" 
$regex = '(?<=123.{17}).{11}' 
Select-string $InputFile -Pattern $regex | Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value 

Di se avete almeno PowerShell 3,0

(Select-string $InputFile -Pattern $regex).Matches.Value 

che dà in entrambi i casi

00000009260 
+0

Hehe ho pensato che probabilmente c'era un modo, ma per qualche ragione non uso mai 'Select-String'. +1 – briantist

5

Non si ha realmente bisogno l'espressione regolare Lookaround per questo:

$InputFile = get-content logfile.log 
$InputFile -match '123.{28}' -replace '123.{17}(.{11}).+','$1'