Как работает ли это выражение [t] скобки рики в grep?

Недавно я видел этот однострочный файл:

$ ps -ef | grep [f]irefox 

thorsen   16730     1  1 Jun19 ?        00:27:27 /usr/lib/firefox/firefox ...

Так что, похоже, он возвращает список процессов с помощью "firefo" x "в данных, но без самого процесса grep, и поэтому кажется примерно эквивалентным:

ps -ef |grep -v grep| grep firefox

Я не могу понять, как это работает. Я просмотрел справочную страницу по grep и в других местах, но не нашел объяснения.

И чтобы усугубить загадку, если я сбегу:

$ ps -ef | grep firefox  > data
$ grep [f]irefox data

thorsen   15820 28618  0 07:28 pts/1    00:00:00 grep --color=auto firefox
thorsen   16730     1  1 Jun19 ?        00:27:45 /usr/lib/firefox/firefox ....

[т] рик, кажется, перестает работать!

Я уверен, что кто-то здесь будет знать, что происходит.

Спасибо.

38
задан 21 June 2012 в 18:22

2 ответа

Причина в том, что строка

grep firefox

соответствует шаблону firefox, но строка

grep [f]irefox

не соответствует шаблону [f]irefox (что эквивалентно шаблон firefox).

Вот почему первый grep соответствует своей собственной командной строке процесса, а второй - нет.

0
ответ дан 21 June 2012 в 18:22

Выражение в квадратных скобках является частью сопоставления с шаблоном класса символов grep bash (и других оболочек).

Программа grep по умолчанию понимает основные регулярные выражения POSIX. С этим вы можете определить классы персонажей. Например, ps -ef | grep [ab9]irefox найдет « a irefox», « b irefox», « 9 irefox», если они существуют, но не существуют » ab irefox».

Команда grep [a-zA-Z0-9]irefox даже найдет все процессы, которые начинаются с ровно одной буквы или цифры и заканчиваются на «irefox».

Итак, ps -ef | grep firefox ищет строки с firefox в нем. Поскольку в самом процессе grep есть «firefox», grep также находит это. Добавляя [], мы ищем только класс символов "[f]" (который состоит только из буквы "f" и поэтому эквивалентен просто "f" без скобок). Преимущество скобок теперь состоит в том, что строка «firefox» больше не появляется в команде grep. Следовательно, сам grep не будет отображаться в результате поиска.

Поскольку не так много людей знакомы с квадратными скобками, такими как сопоставление классов символов и регулярные выражения в целом, второй результат может показаться немного загадочным.

Если вы хотите исправить второй результат, вы можете использовать их следующим образом:

ps -ef | grep [f]irefox  > data
grep firefox data

(ссылка)

0
ответ дан 21 June 2012 в 18:22

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

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