Назад | Перейти на главную страницу

Почему grep ps [p] rocess_name исключает grep из результатов

Классный трюк, который избавляет вас от необходимости использовать grep -v при выводе grep ps (да, я знаю, что pgrep существует), заключается в том, чтобы поместить первую букву процесса в класс символов, например ps -ef |grep [s]vn. Это исключит grep svn от включения в вывод. Почему это работает? GNU grep.

Grep ищет регулярное выражение, например [Pp]rocess найду Process или process, но интересным побочным эффектом является то, что в командной строке операции grep есть ] застрял там, что означает, что строка grep не содержит слова process, он содержит слово p]rocess, что не соответствует.

Так эффективно вы удаляете слово process из вашей строки grep, поместив туда закрывающую скобку, но все же позволяя ей соответствовать слову в других строках.

Квадратные скобки являются частью сопоставления с образцом в grep. В принципе grep получает базовое регулярное выражение:

[12p] rocess будет расширен до: 1process 2rocess process

Теперь grep будет искать [1]rocess [2]rocess [p]rocess что - как видите - это не process.

Квадратные скобки соответствуют классу символов в регулярных выражениях. Вы можете узнать больше о регулярных выражениях и сопоставлении символов здесь:

http://www.regular-expressions.info/charclass.html