Co oznacza i robi grep -v „grep”?

17

Zastanawiałem się, co to grep -v "grep"znaczy i co to znaczy?

Joe
źródło
8
Możesz man grepprzeczytać referencyjną stronę instrukcji dla polecenia lub uzyskać więcej informacji na temat niektórych poleceń (w tym grep), które możesz info grep.... tj. twój system ma dokumentację, która często jest bardzo przydatna.
guiverc
12
grep -v "grep"jest często używany do odfiltrowywania samego grepa podczas listowania procesów, i który zazwyczaj obejmuje 3 potoki, chociaż istnieją oczywiście lepsze metody, pgrepktóre pozwalają na znacznie mniejszą „hydraulikę”. Zobacz unix.stackexchange.com/q/74185/85039
Sergiy Kolodyazhnyy
13
To wystarczy Dzwonię do mojego rootkita grep.
Joshua
Zwykle używany w kontekście niezwiązanym z bezpieczeństwem, np. ps aux | grep fubar | grep -v grepGdzie fubarcoś rozwijam, które przestało odpowiadać i którego identyfikator chcę znaleźć, aby go zabić. Załóżmy, że są dwa z nich, więc killalljest niewłaściwe.
nigel222

Odpowiedzi:

69

grep -v "grep"pobiera dane wejściowe linia po linii i wyświetla tylko te linie, w których grepsię nie pojawia. Bez -vtego wyświetlałby tylko linie, w których grep się pojawia. Zobacz man grepszczegóły.

Jeśli chodzi o samo grepnarzędzie, nie ma znaczenia, że ​​wzorzec grepprzekazany mu jako argument jest taki sam jak jego nazwa. Ale w większości przypadków, gdy grep -v grepfaktycznie się pojawia, nie jest to przypadek.

grep -v grep(lub grep -v 'grep'lub grep -v "grep") często pojawia się po prawej stronie potoku, którego lewa strona jest pspoleceniem. Prawdopodobnie tam, gdzie to widziałeś. Na przykład mogę szukać programów, których nazwy, ścieżki lub argumenty wiersza poleceń sugerują, że są one powiązane z Xfce:

ek@Io:~$ ps x | grep xfce
 2955 ?        Ssl    0:10 xfce4-power-manager
 2958 ?        S      0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
31901 pts/1    S+     0:00 grep --color=auto xfce

Moje greppolecenie pojawiło się w danych wyjściowych, ale nie tego szukam. Szukam informacji o procesach, które już działały, gdy sprawdzałem, co się dzieje, a nie o procesie, który działał tylko z powodu mojego wysiłku, aby zbadać, co się dzieje.

Jednym z powszechnych sposobów na usunięcie tego rozproszenia jest dodanie kolejnej potoku do grep -v grep:

ek@Io:~$ ps x | grep xfce | grep -v grep
 2955 ?        Ssl    0:10 xfce4-power-manager
 2958 ?        S      0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd

grepbez -Ftraktuje wzorzec jako wyrażenie regularne, a nie stały ciąg . Tak więc innym podejściem jest napisanie wyrażenia regularnego, które pasuje dokładnie, xfceale jest napisane inaczej. Na przykład:

ek@Io:~$ ps x | grep '[x]fce'
 2955 ?        Ssl    0:10 xfce4-power-manager
 2958 ?        S      0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd

Działa [x]to, ponieważ jest to klasa znaków, która dokładnie pasuje do litery x.


Wadą tych popularnych metod jest to, że odfiltrowują linie zawierające grepnawet te, które nie są greppoleceniem, które sam wykonałeś. Mogą to nawet nie być greppolecenia - tylko polecenia, których nazwy, ścieżki lub argumenty wiersza poleceń zawierają grep . Tak więc, jak zauważył Sergiy Kolodyazhnyy , często żaden z tych sposobów (ani żadne inne podejście obejmujące potokowanie wyników ps) nie jest naprawdę idealny i, jak wspomniał Nic Hartley , inne sposoby często wykorzystują pgrep. Na przykład:

ek@Io:~$ pgrep -af xfce
2955 xfce4-power-manager
2958 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
  • -a pokazuje pełną linię poleceń. Pomiń, aby wyświetlić tylko numer identyfikacyjny procesu.
  • -f wyszukuje w pełnym wierszu poleceń. Pomiń, aby wyszukać tylko nazwy.
Eliah Kagan
źródło
10
Warto też wspomnieć pgrepo innej alternatywieps | grep
pozew
8

grep --helpmówi nam, co -vrobi flaga:

-v, --invert-match        select non-matching lines

Możesz użyć -vflagi, aby wydrukować odwraca dopasowanie; oznacza to, że pasuje tylko do tych wierszy, które nie zawierają danego słowa. Na przykład wydrukuj wszystkie wiersze, które nie zawierają paska słów:

$ grep -v bar /path/to/file

( czytaj więcej ... )

Karlom
źródło