Что значит и делает grep -v «grep»?


17

Мне было интересно, что grep -v "grep"значит и что это значит?


8
Вы можете man grepпрочитать страницу справочного руководства для команды, или для получения дополнительной информации об определенных командах (в том числе grep) вы можете info grep.... т.е. Ваша система имеет документацию, которая часто очень удобна.
Guiverc

12
grep -v "grep"часто используется для фильтрации самого grep при перечислении процессов, что обычно включает в себя 3 конвейера, хотя, конечно, есть и более эффективные методы, pgrepкоторые позволяют значительно меньше использовать "сантехнику". См. Unix.stackexchange.com/q/74185/85039
Сергей Колодяжный

13
Это делает это. Я звоню своему руткиту grep.
Джошуа

Обычно используется в контексте, не связанном с безопасностью, например, ps aux | grep fubar | grep -v grepгде fubarя разрабатываю что-то, что перестало отвечать, и чей идентификатор я хочу найти, чтобы я мог его убить. Предположим, есть два из них, так killallчто неуместно.
nigel222

Ответы:


69

grep -v "grep"принимает вход за строкой и выводит только те строки, в которых grepне появляется. Без -vнего он будет выводить только те строки, в которых grep он появляется. Смотрите man grepподробности.

Что касается самой grepутилиты, то неважно, что шаблон, grepпереданный ей в качестве аргумента, совпадает с ее именем. Но в большинстве случаев, когда это grep -v grepдействительно происходит, это не случайно.

grep -v grep(или grep -v 'grep'или grep -v "grep") часто появляется на правой стороне канала , левая сторона которого является psкомандой. Это вероятно, где вы видели это. Например, я могу искать запущенные программы, чьи имена, пути или аргументы командной строки предполагают, что они связаны с 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

Моя grepкоманда была показана в выводе, но это не то, что я ищу. Я ищу информацию о процессах, которые уже выполнялись, когда я проверял, что работает, а не о процессе, который выполняется только из- за моих усилий, чтобы проверить, что работает.

Один из распространенных способов убрать это отвлечение - добавить еще один канал 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

grepбез -Fобрабатывает его шаблон как регулярное выражение, а не как фиксированную строку . Поэтому другой подход заключается в написании регулярного выражения, которое точно соответствует, xfceно написано по-другому. Например:

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

Это работает, потому что [x]это класс символов, который точно соответствует букве x.


Одним из недостатков этих популярных методов является то, что они будут отфильтровывать строки, содержащие grepдаже те grepкоманды, которые вы запускали сами. Они могут даже не быть grepкомандами - просто команды, чьи имена, пути или аргументы командной строки содержат grep . Таким образом, как отметил Сергей Колодяжный , зачастую ни один из этих способов (ни какой-либо другой подход, связанный с передачей результатов ps) не является действительно идеальным, и, как отметил Ник Хартли , часто используют другие способыpgrep . Например:

ek@Io:~$ pgrep -af xfce
2955 xfce4-power-manager
2958 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
  • -a показывает полную командную строку. Опустите его, чтобы показать только идентификационный номер процесса.
  • -f поиск в полной командной строке. Опустите его, чтобы искать только имена.

10
Также стоит упомянуть pgrepдругую альтернативуps | grep
Fund Monica's судебный процесс

8

grep --helpговорит нам, что -vделает флаг:

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

Вы можете использовать -vфлаг для печати инвертирует совпадение; то есть он соответствует только тем строкам, которые не содержат данное слово. Например, выведите все строки, которые не содержат строку слова:

$ grep -v bar /path/to/file

( читать дальше ... )

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.