2013-03-04 9 views
94

Ich bin auf der Suche nach der PowerShell gleich grep --file=filename. Wenn Sie grep nicht kennen, ist der Dateiname eine Textdatei, in der jede Zeile ein reguläres Ausdrucksmuster aufweist, das Sie abgleichen möchten.PowerShell entspricht grep -f

Vielleicht fehlt mir etwas offensichtlich, aber Select-String scheint diese Option nicht zu haben.

Antwort

103

Der -Pattern Parameter in Select-String unterstützt ein n Array von Mustern. Also derjenige, den Sie suchen ist:

Get-Content .\doc.txt | Select-String -Pattern (Get-Content .\regex.txt) 

Dieser durchsucht die Textdatei doc.txt durch jede Regex (eine pro Zeile) in regex.txt

+0

Danke - das macht für mich am meisten Sinn. – Fordio

+5

Auch die Fertigstellung der PowerShell-Registerkarte macht Befehle richtig groß geschrieben, so dass es nicht schwer ist, sie einzugeben. – joon

+0

@joon Ein paar Jahre zu spät, aber ich würde hinzufügen, dass Powershell Groß-und Kleinschreibung nicht beachtet, so dass die Großschreibung von Befehlen kein Problem ist. – Vache

1

aber Select-String scheint diese Option nicht zu haben.

Korrekt. PowerShell ist nicht ein Klon von * nix Shells 'Toolset.

aber es ist nicht schwer, so etwas wie es selbst zu bauen:

$regexes = Get-Content RegexFile.txt | 
      Foreach-Object { new-object System.Text.RegularExpressions.Regex $_ } 

$fileList | Get-Content | Where-Object { 
    foreach ($r in $regexes) { 
    if ($r.IsMatch($_)) { 
     $true 
     break 
    } 
    } 
    $false 
} 
21

Ich bin mit grep nicht vertraut, aber mit Select-String können Sie tun:

Get-ChildItem filename.txt | Select-String -Pattern <regexPattern> 

Sie auch tun können dass mit Get-Content:

(Get-Content filename.txt) -match 'pattern' 
+1

Erweitert dies z. 'dir * .cs -Recurse | sls "TODO" | Wählen Sie -Unique "Path". Danke für den ausgezeichneten Zeiger. – Jeroen

1

Vielleicht?

[regex]$regex = (get-content <regex file> | 
foreach { 
      '(?:{0})' -f $_ 
     }) -join '|' 

Get-Content <filespec> -ReadCount 10000 | 
foreach { 
      if ($_ -match $regex) 
      { 
       $true 
       break 
      } 
     } 
50
PS) new-alias grep findstr 
PS) C:\WINDOWS> ls | grep -I -N exe 

105:-a---  2006-11-02  13:34  49680 twunk_16.exe 
106:-a---  2006-11-02  13:34  31232 twunk_32.exe 
109:-a---  2006-09-18  23:43  256192 winhelp.exe 
110:-a---  2006-11-02  10:45  9216 winhlp32.exe 

PS) grep /? 
+5

Ich habe nie verstanden, wie das so viele Stimmen bekommen hat. Es ist nicht einmal die Frage beantworten .. –

+5

Was ich an dieser Antwort mag ist, dass 'findstr' am meisten funktioniert wie' grep' auf Linux tut. 'Select-String' eignet sich hervorragend zum Arbeiten mit Objekten, aber manchmal möchten Sie nur nach Zeichenfolgen suchen. –

+2

Es ist bemerkenswert, dass 'findstr' nicht PowerShell-nativ ist, sondern Eingabeaufforderung. – anishpatel

3

So fand ich eine ziemlich gute Antwort auf diesen Link: https://www.thomasmaurer.ch/2011/03/powershell-search-for-string-or-grep-for-powershell/

Aber im Grunde ist es:

Select-String -Path "C:\file\Path\*.txt" -Pattern "^Enter REGEX Here$" 

Diese Suche eine Verzeichnisdatei gibt (* oder Sie können Geben Sie einfach eine Datei an) und suchen Sie alle Dateien in einer PowerShell-Zeile, ähnlich wie grep. Die Ausgabe wird ähnlich sein wie:

doc.txt:31: Enter REGEX Here 
HelloWorld.txt:13: Enter REGEX Here 
+0

Er möchte das Muster aus einer Datei laden. –