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 поиск в полной командной строке. Опустите его, чтобы искать только имена.
man grepпрочитать страницу справочного руководства для команды, или для получения дополнительной информации об определенных командах (в том числе grep) вы можетеinfo grep.... т.е. Ваша система имеет документацию, которая часто очень удобна.