alphasec academy

ps uax | grep [p]wsh - odnajdź wśród procesów tekst pwsh, jednak pomiń proces z grepem

Dodatkowe informacje

Taka konstrukcja jest zupełnie często wykorzystywana w praktyce, warto więc wiedzieć dokładnie co się dzieje. Zakładając, że szukamy procesu, w którym występuje tekst
pwsh
, jeśli napiszemy po prostu
ps uax | grep pwsh
zostanie znaleziony zarówno potencjalnie szukany proces, jak i nasz proces z grepem, ponieważ też zawiera tekst
pwsh
. Oczywiście moglibyśmy przekierować wszystko do kolejnego grepa z parametrem
-v
, który znajdzie wszystkie linie niepasujące do wzorca, czyli:
ps aux | grep pwsh | grep -v grep
Wystarczy jednak skorzystać z małego tricku i napisać:
ps uax | grep [p]wsh
Spowoduje to, że do grepa jako wyszukiwany string trafi napis
[p]wsh
, który następnie grep potraktuje jako zakres (podany w
[]
) złożony z jednego znaku (
p
), po którym wystąpią znaki
wsh
czyli nasze
pwsh
.

Jeden haczyk

Należy jednak wiedzieć, że
bash
(i inne powłoki) również stara się rozwiązać przekazane wzorce z wykorzystaniem
*
,
?
czy też
[]
. Oznacza to, że jeśli w aktualnym katalogu będzie istniał plik
pwsh
, zostanie on dopasowany na poziomie basha, a więc do grepa trafi już rozwiązana wersja czyli
pwsh
, a nie
[p]wsh
i nasza sztuczka się nie powiedzie. Niech zilustruje to poniższy screenshot.

Subskrybuj

Jeśli chcesz otrzymywać nowe, mięsiste protipy na maila, a także zostać czasem powiadomiony o wartościowych wydarzeniach - dołącz do subskrybentów.