ALPHACON BBSGość · pl
← Protipy

Protipy / Bash / Unix

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

ps uax | grep [p]wsh

Wstęp

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.