kilka słów o jednej z najczęściej wykonywanej czynności – wyszukiwanie ciągów znaków. przydatne w każdym aspekcie – debugowanie wyników, przeglądanie logów lub po prostu zawężanie outputu. w Linuxie jest stary, dobry grep. a co jest w PS?
w pierwszej kolejności jest Select-String. narzędzie potężne – i jak to często w przypadq PS, zdradliwe. największą zdradą jest fakt, że sls [automatyczny alias od PS3.o] nie jest zwykłym grep’em textowym – jest narzędziem obiektowym. praktycznie wszystko w PS jest obiektem, więc również listingi nimi są.
zależnie od wersji PS – 1.o, …4.o – dostaniemy inne wyniki. w wersji 3.o i mniejszej, przy standardowej 'tabelce’, dostaniemy wyłącznie wynik pojedynczej kolumny:
PS C:\> Get-Process | Select-String power
System.Diagnostics.Process (powershell)
w PS4.o wyniki najpierw są parsowane do stringa, więc wynik jest bardziej tym, czego można się spodziewać (ALLELUJA!):
PS C:\> Get-Process|sls power
512 25 72944 82868 611 4,05 3528 powershell
jak zatem radzić sobie z Select-String w PS3.o-? IMHO najprostszym sposobem jest wykorzystanie 'starego, dobrego’ findstr. dość drastyczne różnice w wersjach PS to jedna z największych bolączek – wszystko idzie w dobrym kierunq, ale niespójność konsoli i narzędzi na poszczególnych serwerach jest WIELKIM PROBLEMEM. kiedyś o tym już pisałem obszerniej. dodatkowo, na dzień dzisiejszy, wersja 4.o [dostępna w win8.1/12] jest dostępna wyłącznie 'preview’.
a jak ktoś się uprze, żeby jednak koszernie używać Select-String w PS3.o- oto jak to powinno wyglądać:
PS C:\> (Get-Process | Out-String ) -split "`n" | Select-String power
645 30 140712 157660 647 11.69 7728 powershell
masakra, co? nie dość, że trzeba najpierw skonwertować wynik na string, to jeszcze trzeba powstawiać line-feedy. jest jednak jedna cecha Select-String, która powoduje, że czasem warto się przemęczyć – parametr 'context’. głupi findstr Ci tego nie da (; context powoduje wyświetlenie X linii przed i po wystąpieniu danego ciągu. jest to niezwykle przydatne np. przy filtrowaniu [grepowaniu (; ] netstat. odpowiedź na pytanie 'jaka aplikacja bloqje port 53500?’:
PS C:\> netstat -anb |sls 53500 -Context 1
[lync.exe]
> TCP 192.168.7.77:53500 157.55.236.69:443 ESTABLISHED
[Explorer.EXE]
przy prostym findstr dostaniemy wyłącznie pojedynczą linię – co nie odpowie na pytanie…
dość fajnym dodatkiem jest narzędzie outgridview, które przy przeglądaniu wyników może również wiele dobrego wnieść [dostępne po zainstalowaniu PS ISE]. daje możliwość graficznego przeglądania wyników i dynamicznego filtrowania:
PS C:|>Get-Process | Out-GridView
eN.