PowerShell entspricht grep -f

157

Ich suche die PowerShell-Entsprechung zu grep --file=filename. Wenn Sie nicht wissen grep, ist Dateiname eine Textdatei, in der jede Zeile ein Muster für reguläre Ausdrücke enthält, mit dem Sie übereinstimmen möchten.

Vielleicht fehlt mir etwas Offensichtliches, aber ich Select-Stringhabe diese Option anscheinend nicht.

Fordio
quelle

Antworten:

178

Der -PatternParameter in Select-Stringunterstützt eine Reihe von Mustern. Das, wonach Sie suchen, ist:

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

Dies durchsucht die Textdatei doc.txtunter Verwendung jedes regulären Ausdrucks (einer pro Zeile) inregex.txt

Frode F.
quelle
6
Durch die Vervollständigung der Registerkarte "PowerShell" werden Befehle ordnungsgemäß großgeschrieben, sodass die Eingabe nicht schwierig ist.
Joon
3
@joon Ein paar Jahre zu spät, aber ich möchte hinzufügen, dass Powershell die Groß- und Kleinschreibung nicht berücksichtigt, sodass die Großschreibung von Befehlen kein Problem darstellt.
siehe
1
@Vache natürlich - Ich denke, mein Kommentar oben ist eine Antwort auf einen anderen Kommentar, aber es scheint, dass der Kommentar nicht mehr weg ist.
Joon
85
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 /?
dawciobiel
quelle
17
Ich habe nie verstanden, wie das so viele Stimmen bekommen hat. Es ist nicht einmal die Frage zu beantworten ..
Frode F.
18
Was mir an dieser Antwort gefällt, ist, dass sie findstrunter grepLinux am besten funktioniert. Select-Stringeignet sich hervorragend für die Arbeit mit Objekten, aber manchmal möchten Sie nur mit Zeichenfolgen übereinstimmen.
Elijah W. Gagne
7
Es ist erwähnenswert, dass dies findstrnicht in PowerShell, sondern in der Eingabeaufforderung enthalten ist.
Anishpatel
1
Dieser Befehl findstr stand mir bereits zur Verfügung und funktionierte genau wie Unix GREP.
Lennon
37

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

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

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

(Get-Content filename.txt) -match 'pattern'
Shay Levy
quelle
4
Erweitert auf z dir *.cs -Recurse | sls "TODO" | select -Unique "Path". Danke für den hervorragenden Zeiger.
Jeroen
4

Daher habe ich unter diesem Link eine ziemlich gute Antwort gefunden: 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 bietet eine Verzeichnisdateisuche (* oder Sie können einfach eine Datei angeben) und eine Dateiinhaltssuche in einer Zeile von PowerShell, ähnlich wie grep. Die Ausgabe ist ähnlich wie:

doc.txt:31: Enter REGEX Here
HelloWorld.txt:13: Enter REGEX Here
cody.tv.weber
quelle
1
Er möchte das Muster aus einer Datei laden.
Brian Gordon
2

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

Wenn Sie beispielsweise überprüfen möchten, ob der Dienst Elasicsearch im Status ausgeführt wird , können Sie so etwas wie das folgende Snippet in Powershell ausführen

net start | grep Elasticsearch

Ivan Ruski
quelle
2

Ich hatte das gleiche Problem beim Versuch, Text in Dateien mit Powershell zu finden. Ich habe Folgendes verwendet, um so nah wie möglich an der Linux-Umgebung zu bleiben.

Hoffentlich hilft das jemandem:

Power Shell:

PS) new-alias grep findstr
PS) ls -r *.txt | cat | grep "some random string"

Erläuterung:

ls       - lists all files
-r       - recursively (in all files and folders and subfolders)
*.txt    - only .txt files
|        - pipe the (ls) results to next command (cat)
cat      - show contents of files comming from (ls)
|        - pipe the (cat) results to next command (grep)
grep     - search contents from (cat) for "some random string" (alias to findstr)

Ja, das funktioniert auch:

PS) ls -r *.txt | cat | findstr "some random string"
Magnus Esterhuizen
quelle
0

aber select-String scheint diese Option nicht zu haben.

Richtig. PowerShell ist kein Klon des Toolset * 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
}
Richard
quelle
Das ist eine schlechte Antwort. Select-String -Pattern somestringist viel sauberer
Kolob Canyon
0

Vielleicht?

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

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