Мне было интересно, что grep -v "grep"
делает и что это значит?
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
ищет в полной командной строке. Опустите его, чтобы искать только имена. grep --help
говорит нам, что делает флаг -v
:
-v, --invert-match select non-matching lines
Вы можете использовать флаг -v
для печати инвертирует совпадение; то есть он соответствует только тем строкам, которые не содержат данное слово. Например, выведите все строки, которые не содержат слово bar:
$ grep -v bar /path/to/file
( подробнее ... )