Ostatnio widziałem ten jednowarstwowy:
$ ps -ef | grep [f]irefox
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ...
Wydaje się więc, że zwraca listę procesów z „firefox” w danych, ale pomija sam proces grep, a zatem wydaje się w przybliżeniu równoważny z:
ps -ef |grep -v grep| grep firefox
Nie rozumiem jednak, jak to działa. Przeglądałem stronę man na grep i gdzie indziej, ale nie znalazłem wyjaśnienia.
I pogłębić tajemnicę, jeśli uruchomię:
$ ps -ef | grep firefox > data
$ grep [f]irefox data
thorsen 15820 28618 0 07:28 pts/1 00:00:00 grep --color=auto firefox
thorsen 16730 1 1 Jun19 ? 00:27:45 /usr/lib/firefox/firefox ....
rick [t] wydaje się przestać działać!
Jestem pewien, że ktoś tu będzie wiedział, co się dzieje.
Dzięki.
command-line
bash
grep
Thorsen
źródło
źródło
Odpowiedzi:
Wyrażenie w nawiasach kwadratowych jest częścią
powłoki bash (i również innych powłok)dopasowywania wzorców klas znaków grep.grep
Program domyślnie rozumie podstawowych wyrażeń regularnych POSIX. Dzięki temu możesz zdefiniować klasy postaci. Na przykładps -ef | grep [ab9]irefox
znajdzie " na irefox", " b irefox", " 9 irefox" jeśli te istniały, ale nie " ab irefox".Polecenie
grep [a-zA-Z0-9]irefox
znajdzie nawet wszystkie procesy, które zaczynają się dokładnie jedną literą lub cyfrą i kończą na „irefox”.Więc
ps -ef | grep firefox
szuka liniifirefox
w nim. Ponieważ sam proces grep zawiera „firefox”, grep również to znajduje. Dodając „a”[]
, szukamy tylko klasy znaków „[f]” (która składa się tylko z litery „f” i dlatego jest odpowiednikiem tylko „f” bez nawiasów). Zaletą nawiasów jest to, że ciąg „firefox” nie pojawia się już w poleceniu grep. Dlatego samo grep nie pojawi się w wyniku grep.Ponieważ niewiele osób zna nawiasy kwadratowe jako dopasowanie klas znaków i wyrażenia regularne w ogóle, drugi wynik może wyglądać nieco tajemniczo.
Jeśli chcesz naprawić drugi wynik, możesz użyć ich w ten sposób:
(Odniesienie)
źródło
[f]
to nawias dopasowujący wzorce wyrażeń regularnych dla klas znaków. Jak w „[a-z0-9] irefox” grep pasowałby również do „airefox” i „0irefox”. Możesz łatwo zobaczyć, że nie jest to wbudowana bash, ponieważecho $([f])
zwraca błąd.[f]irefox
tego działania jest to, że nie jest on rozszerzany przez powłokę. Gdy powłoka rozwija się[f]irefox
dofirefox
, powodujegrep
to zobaczeniefirefox
, a następniefirefox
jest częściągrep
ciągu poleceń, dokładnie tak, jakbygrep firefox
była uruchomiona. Ale dobrze jest zachować powłoki wzorzec dopasowania na uwadze , szczególnie gdy skryptowy, bo jeśli istnieje plik o nazwiefirefox
w bieżącym katalogu , następnie powłoka ma rozwijać[f]irefox
sięfirefox
i ta metoda zawiedzie, czyligrep
linię odps
pokazano.Powodem jest to, że ciąg
pasuje do wzoru
firefox
, ale ciągnie pasuje do wzorca
[f]irefox
(co jest równoważne wzorowifirefox
).Właśnie dlatego pierwszy grep odpowiada własnej linii poleceń procesu, a drugi nie.
źródło