2013-03-04 8 views
94

Szukam odpowiednika PowerShell grep --file=filename. Jeśli nie znasz grep, nazwa pliku jest plikiem tekstowym, w którym każda linia ma wzór regularnego wyrażenia, który chcesz dopasować.PowerShell odpowiednik grep -f

Może brakuje mi czegoś oczywistego, ale wydaje się, że Select-String nie ma tej opcji.

Odpowiedz

103

parametr w Select-String-Pattern podtrzymuje n tablica wzorców. Więc ten, którego szukasz:

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

ta przeszukuje tekstowego doc.txt za pomocą każdego wyrażenia regularnego (jeden na linię) w regex.txt

+0

Dzięki - to ma dla mnie największy sens. – Fordio

+5

Ponadto, zakończenie funkcji PowerShell sprawi, że polecenia będą pisane poprawnie, więc nie jest to trudne do wprowadzenia. – joon

+0

@joon Kilka lat za późno, ale dodam, że Powershell nie rozróżnia wielkości liter, więc pisanie wielkimi literami poleceń nie jest problemem. – Vache

1

, ale select-String nie ma tej opcji.

Prawidłowo. PowerShell to , a nie klon zestawu narzędzi * nix shells.

Jednak nie jest trudno zbudować coś podobnego siebie:

$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

nie jestem zaznajomiony z grep, ale z Select-String można zrobić:

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

Można również zrobić że z Get-Content:

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

Rozszerzony do np. 'dir * .cs -Recurse | sls "TODO" | wybierz -Unik "Ścieżka" '. Thx za doskonały wskaźnik. – Jeroen

1

może?

[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

Nigdy nie rozumiałem, jak to zyskało tak wiele głosów. To nawet nie odpowiada na pytanie. –

+5

To co podoba mi się w tej odpowiedzi, to że 'findstr' działa najbardziej jak' grep' na Linuksie. 'Select-String' świetnie nadaje się do pracy z obiektami, ale czasami po prostu chcesz dopasować do ciągów. –

+2

Warto zauważyć, że 'findstr' nie jest natywnym dla PowerShell, ale Command Prompt. – anishpatel

3

Więc znalazłem dość dobrą odpowiedź pod tym linkiem: https://www.thomasmaurer.ch/2011/03/powershell-search-for-string-or-grep-for-powershell/

Ale przede wszystkim jest to:

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

Daje to wyszukiwanie plików katalogu (* lub można wystarczy podać plik) i przeszukać zawartość pliku w jednym wierszu PowerShell, bardzo podobnym do grep. Dane wyjściowe będą podobne do:

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

Chce załadować wzór z pliku. –