it-swarm.com.de

PowerShell entspricht grep -f

Ich suche das PowerShell-Äquivalent zu grep --file=filename. Wenn Sie grep nicht kennen, ist Dateiname eine Textdatei, in der jede Zeile ein Muster mit regulären Ausdrücken enthält, mit dem Sie übereinstimmen möchten.

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

136
Fordio

Das -Pattern Parameter in Select-String unterstützt eine Reihe von Mustern. Also das, was Sie suchen, ist:

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

Dies durchsucht die Textdatei doc.txt mit jedem regulären Ausdruck (einer pro Zeile) in regex.txt

154
Frode F.
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 /?
71
dawciobiel

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

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

Das können Sie auch mit Get-Content machen:

(Get-Content filename.txt) -match 'pattern'
37
Shay Levy

Also fand ich unter diesem Link eine ziemlich gute Antwort: https://www.thomasmaurer.ch/2011/03/powershell-search-for-string-or-grep-for-powershell/

Aber im Wesentlichen ist es:

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

Dies ermöglicht eine Verzeichnisdateisuche (* oder Sie können nur eine Datei angeben) und eine Suche nach Dateiinhalten in einer einzigen Zeile von PowerShell, die grep sehr ähnlich ist. Die Ausgabe sieht ungefähr so ​​aus:

doc.txt:31: Enter REGEX Here
HelloWorld.txt:13: Enter REGEX Here
3
cody.tv.weber

Diese Frage hat bereits eine Antwort, aber ich möchte nur hinzufügen, dass es in Windows das Windows-Subsystem für Linux gibt WSL .

Wenn Sie zum Beispiel überprüfen möchten, ob Sie einen Dienst mit dem Namen Elasicsearch haben, der sich im Status running befindet, können Sie so etwas wie das folgende Snippet in Powershell ausführen

net start | grep Elasticsearch

1
Ivan Ruski

aber select-String scheint diese Option nicht zu haben.

Richtig. PowerShell ist nicht ein Klon des Toolset von * nix shells.

Es ist jedoch nicht schwer, so etwas 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
}
0
Richard

Vielleicht?

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

Get-Content <filespec> -ReadCount 10000 |
 foreach {
           if ($_ -match $regex)
             {
              $true
              break
             }
         }
0
mjolinor