Kiedy sprawdzam listę procesów i „wyszukuję” te, które są dla mnie interesujące, to grep
samo w sobie jest uwzględniane w wynikach. Na przykład, aby wyświetlić listę terminali:
$ ps aux | grep terminal
user 2064 0.0 0.6 181452 26460 ? Sl Feb13 5:41 gnome-terminal --working-directory=..
user 2979 0.0 0.0 4192 796 pts/3 S+ 11:07 0:00 grep --color=auto terminal
Zwykle ps aux | grep something | grep -v grep
pozbywam się ostatniego wpisu ... ale nie jest elegancki :)
Czy masz bardziej elegancki sposób na rozwiązanie tego problemu (poza opakowaniem całego polecenia w osobny skrypt, co również nie jest złe)
ps ux | awk '/name/ && !/awk/ {print $2}'
grep -v grep
robi ta część?grep -v grep
wykluczagrep
z wyników grep. Jeśli grep jest używany w połączeniu z ps, to proces grep (z argumentami grep) również zostanie wyświetlony, zaśmiecając wyniki. grep -v grep jest powszechnym sposobem uniknięcia tegoOdpowiedzi:
Zwykła technika jest taka:
Spowoduje to dopasowanie wierszy zawierających
terminal
, któreegrep '[t]erminal'
nie! Działa również na wielu odmianach Uniksa.źródło
ps aux | grep '[r]oot'
. Czy ktoś wie dlaczego?| grep '[t]erminal'
wybiera dowolną linię zawierającą słowo „terminal” bez umieszczania słowa „terminal” na liście procesów. Co próbujesz osiągnąć| grep '[r]oot'
i jak to nie działa? Prawdopodobnie będzie lepsze rozwiązanie.grep '[t]erminal'
dopasuje linie zawierająceterminal
. Wyjście zps aux
będzie zawierało wiersz zgrep '[t]erminal'
(z nawiasami kwadratowymi), który nie zawiera łańcuchaterminal
(bez tego samego).Użyj pgrep . Jest bardziej niezawodny.
źródło
pgrep
nie zadziała, jeśli poszukam na przykładps aux | grep 'ssh options'
pgrep -f
?pgrep
dopasowuje wzorzec tylko do nazwy procesu. Aby dopasować się do całego polecenia, użyj-f
flagi.pgrep
zwraca tylko identyfikatory procesów.pgrep -fl
(ale nie można było zobaczyć pełnej linii cmd bez-f
dopasowania pełnej linii cmd, szczegóły: serverfault.com/a/619788/44183 ). Ale tak, jeśli potrzebujesz innych informacji poza pid, cmdline, potrzebujeszps
. Można je połączyć:ps -p $(pgrep -f foo)
Ta odpowiedź opiera się na wcześniejszej
pgrep
odpowiedzi . Opiera się również na innej odpowiedzi, łączącej użycieps
zpgrep
. Oto kilka przykładów przydatnych szkoleń:Powyższe może być używane jako funkcja :
Porównaj z użyciem
ps
zgrep
. Przydatny wiersz nagłówka nie jest drukowany:źródło
-d
możliwość określenia separatora; np.ps -fp$(pgrep -d , getty)
ps uxp `pgrep <process>`
Zauważ, żep
musi to być ostatni parametr (tj.pux
Nie zadziała)Możesz filtrować w poleceniu ps, np
(lub przeszukaj / proc za pomocą find itp.)
źródło
ps -C <command>
dopasuje dokładnie polecenie. W przypadku użycia z opcjamia
lubx
zgłosi wszystkie procesy, ponieważa
i wyświetlix
listę procesów oprócz zestawu procesów dopasowanych w inny sposób.logind
Dlasystemd-logind
lub do dopasowania argumentów.Jeszcze jedna alternatywa :
Tutaj opcje:
źródło
-C
opcja została już zasugerowana w odpowiedzi @Andreasa Frishe'a zamieszczonej ponad półtora roku wcześniej…Użycie nawiasów do otaczania znaku we wzorcu wyszukiwania wyklucza
grep
proces, ponieważ nie zawiera pasującego wyrażenia regularnego.źródło
Zastrzeżenie: jestem autorem tego narzędzia, ale ...
Użyłbym px :
Oprócz znajdowania procesów z rozsądnym interfejsem wiersza poleceń, robi również wiele innych przydatnych rzeczy, więcej szczegółów na stronie projektu .
Działa na Linuksie i OS X, łatwa instalacja:
źródło
W zależności od ostatecznego przypadku użycia często wolisz zamiast tego awk.
Jest to szczególnie prawdziwe, gdy masz coś takiego
gdzie oczywiście wyrażenie regularne można w trywialny sposób uwzględnić w skrypcie Awk:
Ale tak naprawdę, nie wymyślaj tego na nowo.
pgrep
i przyjaciele są w pobliżu od dawna i radzą sobie z całym problemem znacznie lepiej niż większość reimplementacji ad hoc.źródło
Inną opcją jest edycja
.bash_profile
pliku (lub innego pliku, w którym przechowujesz aliasy bash), aby utworzyć funkcję, która usuwa słowo „grep” z wyników.grep -v grep
Ma być pierwszym w przeciwnym razie--color=auto
nie będzie działać z jakiegoś powodu.Działa to, jeśli używasz basha; jeśli używasz innej powłoki YMMV.
źródło
function grep { command grep -v grep | command grep --color=auto "$@"; }
(zwróć także uwagę na poprawkę argumentu i cytowanie). Jednak jest to zepsute przez to, że żadneps
wywołaniegrep
nie będzie już działać (argumenty są przekazywane niepoprawnie). W każdym razie, o wiele bardziej przydatna funkcja będzie jeden, który zmienia regex, aby to nie pasuje do siebie, zamiast odfiltrowaćgrep
zgrep
wyników oddzielnie. I oczywiście wymyślanie nowych rozwiązań problemu, który został odpowiednio rozwiązany dziesiątki lat temu, nie jest zbyt produktywne.