Select-String

Wyszukuje wzorce tekstu w plikach lub łańcuchach (jak grep).

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 -Path [-Context ]

  • -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 -LiteralPath bierze ś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 (odpowiednik grep -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ów MatchInfo (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).