2009-02-05 4 views
5

Ich versuche, einige Protokolle zu durchforsten und brauche Informationen vor und nach der Zeile, die ich angleichen kann. Wie würde ich das in PowerShell ala "grep -C 2" machen?Parsen, um "grep -C 2" in PowerShell Version 1.0 zu simulieren

In der Version 1, kann ich nicht für r2 warten, dann bekomme ich es auf Produktionsmaschinen zu setzen :)

+0

Was genau macht Grep-C2? – JaredPar

+0

bietet Context, @JaredPar - http://unixhelp.ed.ac.uk/CGI/man-cgi?grep – warren

Antwort

1

Näher hier- weil Select-String zurückgibt Match Objekte, die ich eine Zeilennummer aus (39017) ziehen kann, jetzt muss ich nur die Linie ziehen umliegenden ... so:

gc $bigfile | Select-String melissao | 
%{(gc $bigfile)[($_.LineNumber -2)..($_.LineNumber +2)]} 

Wenn Jeder könnte das etwas aufräumen, um es langsamer zu machen. Vielleicht haben Sie die Antwort. Ansonsten funktioniert diese Lösung aber offensichtlich nicht schnell.

7

Das PowerShell-Äquivalent von Grep ist select-string. Sie können Folgendes verwenden.

cat file | select-string "pattern" -context 2 

Hinweis: Dies funktioniert nur in PowerShell v2.0.

+0

v2: @. Ich kann nicht warten, bis ich es auf Produktionsservern setzen darf. – slipsec

-1

Laden Sie Grep für Windows, und rufen Sie Grep von PowerShell?

3

Anstatt wieder (gc $ bigfile) zu verwenden, was dazu führt, dass PowerShell $ bigfile in den Speicher jedes Objekts liest, das vom ForEach-Object-Cmdlet weitergeleitet wird, sollten Sie die Datei wahrscheinlich in eine Variable und dann Array lesen Index aus, dass, wie so:

$bigfile = gc 'c:\scripts\bigfile.txt' 
$bigfile | Select-String "melissao" | % {$bigfile[($_.LineNumber -3)..($_.LineNumber +1)]} 

da auch die Zeilennummerierung bei 1 beginnt und Array-Indizierung beginnt bei 0 Sie rückwärts von 3 gehen, nicht 2, die Linie zwei Räume oben "zu erhalten Melissio ", und gehe vorwärts um 1, nicht 2, um die Linie zwei Räume unter" Melissao "zu bekommen. Dadurch werden Sie die 5 Linien, die Sie wollen, "melissao", flankiert von den zwei Linien darüber und darunter, erhalten.

Ich bin nicht super vertraut mit Grep -C 2, also weiß ich nicht, ob dies genau diese Funktionalität repliziert.

+0

haben ein upvote- gut "hör auf faul zu sein" zeigt da :) – slipsec