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
.... т.е. Ваша система имеет документацию, которая часто очень удобна.