Что значит grep -v & ldquo; grep & rdquo; значит и делаешь?

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

17
задан 24 June 2019 в 09:53

2 ответа

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 ищет в полной командной строке. Опустите его, чтобы искать только имена.
66
ответ дан 24 June 2019 в 09:53

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

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

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

$ grep -v bar /path/to/file

( подробнее ... )

7
ответ дан 24 June 2019 в 09:53

Другие вопросы по тегам:

Похожие вопросы: