Select-String to powershellowy odpowiednik grep — przeszukuje pliki, łańcuchy i wyjście potoku w poszukiwaniu wzorca i zwraca dopasowane linie razem z numerem wiersza i nazwą pliku. Domyślnie traktuje wzorzec jako wyrażenie regularne i nie zwraca zwykłego tekstu, tylko obiekty MatchInfo — co jest jego największą siłą i jednocześnie pułapką, jeśli przesiadasz się z linuksowego grep. Skrót aliasu to sls.
Składnia i najważniejsze opcje
Podstawowa forma: Select-String -Pattern
-Pattern— wzorzec do znalezienia; domyślnie traktowany jako regex (np.error|warning).-Path— ścieżka do plików, obsługuje znaki wieloznaczne jak*.log. Wariant-LiteralPathbierze ścieżkę dosłownie.-SimpleMatch— wyłącza regex i szuka dosłownego tekstu (ratunek, gdy szukasz kropek, nawiasów czy$).-CaseSensitive— wymusza rozróżnianie wielkości liter; domyślnie wyszukiwanie jest nieczułe na wielkość.-Context— pokazuje linie wokół trafienia, jak, grep -A/-B/-C.-NotMatch— zwraca linie, które nie pasują do wzorca (odpowiednikgrep -v).-List— tylko pierwsze trafienie w każdym pliku; szybkie sprawdzenie „czy to w ogóle tu jest”.-Raw— zwraca czysty tekst dopasowań zamiast obiektówMatchInfo(przydatne w skryptach).
Przykłady użycia
Select-String -Path "C:\logs\*.log" -Pattern "error"— przeszukuje wszystkie logi w katalogu i zwraca linie z „error” wraz z nazwą pliku i numerem wiersza.Get-Content app.log | Select-String "timeout" -Context 2,2— szuka „timeout” w potoku i pokazuje po 2 linie kontekstu z każdej strony trafienia.Select-String -Path *.conf -Pattern "^#" -NotMatch— wyrzuca linie zakomentowane i pokazuje tylko realną konfigurację.sls -Path "*.txt" -Pattern "192.168.1.1" -SimpleMatch— szuka adresu IP dosłownie, bez interpretowania kropek jako „dowolny znak” w regex.Select-String -Path .\src\*.cs -Pattern "TODO" -List— szybki przegląd, które pliki źródłowe zawierają jeszcze niedokończone fragmenty.
Częste błędy i pułapki
Pierwsza pułapka: Select-String zwraca obiekty, nie tekst. Jak przekażesz wynik dalej w potoku, dostaniesz właściwości typu Line, LineNumber czy Filename — a nie gołe linie. Gdy potrzebujesz samego tekstu, dorzuć -Raw albo wyciągnij .Line.
Druga: domyślnie to regex. Szukanie 1.2.3.4 czy C:\temp\ bez -SimpleMatch potrafi dopasować więcej, niż chcesz, bo kropka i backslash mają w regeksie własne znaczenie.
Trzecia: bez -CaseSensitive dopasowanie ignoruje wielkość liter — odwrotnie niż w linuksowym grep, więc nawyk może cię zaskoczyć. I pamiętaj, że -Path bez ścieżki przeszukuje tylko to, co wskażesz; do rekurencji po katalogach podaj pliki przez Get-ChildItem -Recurse w potoku.
Powiązane komendy: Get-Content, Get-ChildItem, Where-Object, findstr (klasyczny odpowiednik z cmd), grep (w świecie linuksowym).