Gdy szukam jakiegoś procesu, który nie istnieje, np
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
Oczywiście nie obchodzi mnie grep - to ma tyle samo sensu, co poszukiwanie ps
procesu!
Jak mogę zapobiec wyświetlaniu grep w wynikach?
ps aux |grep
zpgrep
(lubpgrep -f
).ps aux
, oczekuję). Więc pytanie, jak zapobiecgrep fnord
wyświetlaniu się jako proces wyświetlane, ponieważ oczywiście nie jestem zainteresowany w tym jeden.Odpowiedzi:
Okazuje się, że istnieje rozwiązanie znalezione w pęku kluczy .
Umieszczając nawiasy wokół litery i cudzysłowu wokół łańcucha, szukasz wyrażenia regularnego, które brzmi: „Znajdź znak„ f ”, a następnie„ nord ”.
Ale ponieważ wstawiłeś nawiasy kwadratowe do wzoru „f”, po którym następuje teraz „]”, więc
grep
nie pojawi się na liście wyników. Neato!źródło
grep [f]nord
. Jednak ta linia nie przejdzie przez filtr grep, ponieważ ciąg[f]nord
nie pasuje do wyrażenia regularnego[f]nord
.ps aux | grep fnord | grep -v grep
... co wydaje się już zasugerowane przez kilka osób ... lol[
nawet w bash. Wypróbuj z plikiem nazwanymfnord
w bieżącym katalogu.ps
może być starą sztuczką, ale jest niewiarygodne. Użyj,pgrep
jeśli jest dostępna.fnord
i wywołany programsafnorde
. Albo zadzwonił użytkownikbfnord
, a ty zabiłeś wszystkie jego procesy. Itd.Inną opcją, której używam (szczególnie po to, by sprawdzić, czy proces jest uruchomiony), jest
pgrep
polecenie. Spowoduje to wyszukanie pasującego procesu, ale nie wyświetli linii grep dla wyszukiwania. Podoba mi się, ponieważ jest to szybki sposób wyszukiwania, bez wyrażania regularnego lub ucieczki.źródło
-f
opcja była bardziej podobnaps | grep
.pgrep -f
będzie wyglądać bardziejps -f | grep
.-l
argument, aby pokazać pasujące polecenie.ps | grep '[f]nord'
jest sprytny i czcigodny, ale pgrep ma rację .ps $(pgrep cmd) ...
jeśli w `pgrep brakuje opcji (nie działa to jednak dla pustego zestawu poleceń).Idealnym rozwiązaniem jest to przedstawione przez BriGuy
Ale jeśli nie chcesz tego robić, możesz po prostu wykluczyć wszystkie wiersze pasujące do grep z:
źródło
pgrep
lub znaleźć inne;)Nie jest to najbardziej eleganckie rozwiązanie, ale możesz to zrobić:
$ ps aux | grep fnord | grep -v grep
źródło
grep
w twoim wyrażeniu było słowo . Nie pokaże tego procesu. Załóżmy na przykład, że wywołany plikfoo_grep_bar.txt
jest edytowany przeznano
polecenie. Trwa proces:root 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txt
zgodnie z tą odpowiedzią to nie zadziała:$ ps aux | grep nano | grep -v grep
ponieważ w nazwie pliku znajduje się słowo grep.grep fnord
nie tylkogrep
tj.$ ps aux | grep fnord | grep -v "grep fnord"
W zsh,
grep fnord =(ps aux)
.Chodzi o to, aby najpierw uruchomić
ps aux
, umieścić wynik w pliku, a następnie użyć gogrep
w tym pliku. Tylko, że nie mamy pliku, ponieważ używamy „podstawienia procesu” zsh.Aby to zilustrować, spróbuj
Wynik powinien być taki sam.
Ogólny komentarz do niektórych innych odpowiedzi. Niektóre są zbyt skomplikowane i / lub wymagają długiego pisania. To nie tylko kwestia racji, ale także użyteczności. Ale to nie znaczy, że niektóre z tych rozwiązań są złe; tylko muszą być owinięte w mini-interfejs użytkownika, aby były użyteczne.
źródło
<(command)
.grep grep =(ps aux)
nie pokazuje żadnej linii.print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
źródło
| grep $(echo fnord)
nie wystarczyło? prosisz także sed, aby przeszukał i zastąpił każdy znak w „fnord” swoją wartością? ^^ gratulacje. Założę się, że mogę zrobić jeszcze dłuższy, ale prawdopodobnie nie będzie tak zabawny ^^ps aux | grep '[^]]fnord'
uniknąłby tego gimnastyki.Wyszukiwanie procesów
Jeśli szukasz tylko
fnord
procesów, możesz użyć-C
opcji, aby wybrać według nazwy polecenia:Można to mieszać z opcjami formatu BSD i POSIX według własnych upodobań. Zobacz stronę man ps, aby uzyskać pełną listę.
Szukasz czegoś innego?
Jeśli potrzebujesz czegoś bardziej zaawansowanego niż dokładne wyszukiwanie nazwy polecenia, nie trać nadziei! Nadal można to zrobić z
ps
boku rury. Wszystko, co musimy zrobić, to powiedzieć,ps
aby wykluczyćgrep
procesy z wyniku:-C grep
zaznacza wszystkie procesy grep i-N
neguje wybór. Można tego użyć do wyszukiwania argumentów poleceń, części nazwy polecenia lub bardziej złożonych wyrażeń regularnych.źródło
ps
ale-C
nie jest określone przez POSIX i ma zupełnie inne znaczenie dla BSDMoja odpowiedź jest odmianą typowej odpowiedzi dla wyszukiwania „foobar” na liście „ps”. Argument „-A” „ps” jest bardziej przenośny niż „aux”, jak sądzę, ale ta zmiana nie ma znaczenia dla odpowiedzi. Typowa odpowiedź wygląda następująco:
Zamiast tego używam tego wzoru:
Główną zaletą jest to, że łatwiej jest pisać skrypty oparte na tych wzorcach, ponieważ po prostu łączy się ciąg statyczny „[^]]” z dowolnym wzorcem, którego szukasz. Nie musisz zdejmować pierwszej litery sznurka, a następnie wstawiać go między kwadratowe nawiasy klamrowe, a następnie ponownie łączyć je z powrotem. Podczas pisania skryptów w powłoce łatwiej jest po prostu wcisnąć „[^]]” przed wzorkiem, którego szukałeś. Przecinanie strun w Bash jest brzydką rzeczą, więc moja odmiana tego unika. Ta odmiana mówi, że pokaż linie, w których wzór pasuje BEZ wiodącego prawego nawiasu kwadratowego]. Ponieważ wzorzec wyszukiwania wykluczający nawias kwadratowy faktycznie dodaje nawias kwadratowy do wzorca, nigdy nie będzie pasował do siebie.
Możesz napisać przenośne polecenie psgrep w następujący sposób. Tutaj uwzględniam różnice między Linuksem, OS X BSD i innymi. Dodaje to nagłówki kolumn z „ps”, zapewnia bardziej niestandardowy format „ps”, który lepiej odpowiada moim potrzebom, i wyświetla procesy z listą wyjątkowo, bardzo szeroką, aby żaden z argumentów wiersza poleceń nie został pominięty. Cóż, większość nie jest pominięta. Java, która jest Javą, często robi wszystko w najgorszy możliwy sposób, więc niektóre usługi java będą działać po przekroczeniu maksymalnej dozwolonej długości argumentów, które śledzi tabela procesów. Myślę, że to 1024 znaki. Długość pojedynczego polecenia pozwalająca na uruchomienie procesu jest znacznie dłuższa, ale tabela procesów jądra nie zadaje sobie trudu, aby śledzić wszystko o długości przekraczającej 1 K. Po uruchomieniu polecenia nazwa-polecenia i lista argumentów nie są
źródło
Najprostszym sposobem, aby to zrobić, jest przechowywanie go najpierw w zmiennej:
Call-out: Odpowiedź @ EmanuelBerg
grep fnord =(ps aux)
jest zdecydowanie najbardziej elegancka, choć wymagazsh
. Na krótko miałem go w moich plikach rc, ale bash narzeka na tę składnię, nawet pomimo warunku, który powinien uniemożliwić jego ocenę.Z moich plików rc mam wersję bez rozróżniania wielkości liter, która pobiera argumenty grep:
Spacer po kodzie, jeden punkt w wierszu kodu:
ps
dane wyjściowe (wlocal
zmiennej, aby zniknęły po powrocie funkcji)$PS_OUTPUT
i usuń wszystko po pierwszym wierszu (regex equiv:)s/\n.*$//msg
. To uniemożliwia nam grepowanie tytułups
wynik ze wszystkim oprócz pierwszego wiersza (regex equiv:)s/^.*\n//m
i grep jego zawartość,-i
aby nie rozróżniać wielkości liter i ze wszystkimi argumentami przekazanymi tej funkcji (w przypadku braku argumentów^
, co odpowiada początkowi dowolnego pasującego wiersza wszystko)źródło
Może tym razem czas na użycie prawdziwej sekwencji. Zastosowanie rur sprawia, że jest równoległy.
Brzydkie, ponieważ będzie plik
f
, ale to nie moja wina, że nie ma składni dla procesów sekwencyjnych, w których nadal chcesz korzystać z danych wyjściowych wcześniej uruchomionego procesu.Sugestia dotycząca składni operatora sekwencyjnego:
źródło
ps
dane wyjściowegrep
, używam więcej pamięci (lub dysku) na dłużej.Komenda pgrep, jak stwierdzili inni, zwróci PID (identyfikator procesu) procesów na podstawie nazwy i innych atrybutów. Na przykład,
poda Ci PID, oddzielone przecinkami (,) wszystkich procesów, których nazwy są uruchamiane przez użytkownika
<username>
. Możesz użyć przełącznika -x wcześniej, aby zwrócić tylko dokładne dopasowania.Jeśli chcesz uzyskać więcej informacji o tych procesach (jak sugeruje uruchomienie opcji Aux z ps), możesz użyć opcji -p z ps, która jest zgodna z PID. Na przykład
poda szczegółowe informacje o wszystkich PID odpowiadających poleceniu pgrep.
źródło
ps
kończy się niepowodzeniem, jeślipgrep
zwraca pusty zestaw. Mam odpowiedź, która opiera się na twojej i próbuje rozwiązać ten problem.Oto prosty przykład znalezienia PID
ssh-agent
dla nazwy użytkownika bez pokazywania PIDgrep
samego procesu:Jeśli chcesz na przykład zabić
ssh-agent
dla bieżącego użytkownika, możesz użyć następującego polecenia:Aby utworzyć przydatny alias, dodaj do pliku ~ / .bashrc lub ~ / .zshrc następujący kod:
I użycie tutaj aliasu to przykłady, które zmuszają wszystkich do nauki wyrażeń regularnych:
PS Testowałem te polecenia tylko na Ubuntu i Gentoo.
źródło
"${USER}.* /usr/bin/ssh-agent"
. Działa, ponieważ powiedziałeś[ ]
; tzn. po prostu używasz mechanizmu przyjętej odpowiedzi. Równie dobrze możeszgrep "[s]sh-agent"
.Możesz to zrobić łatwo, po prostu definiując ALIAS w
.bashrc
taki sposób:źródło
grep
użycie w innych przypadkach. Spróbowaćecho I love grep | grep love
.Użycie opcji -x (dopasowanie ścisłe) działało dla mnie. Połączyłem go z -f (pełna linia poleceń), aby dokładnie dopasować mój proces do:
źródło