Недавно я видел этот однострочный файл:
$ 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 ....
[т] рик, кажется, перестает работать!
Я уверен, что кто-то здесь будет знать, что происходит.
Спасибо.
Причина в том, что строка
grep firefox
соответствует шаблону firefox
, но строка
grep [f]irefox
не соответствует шаблону [f]irefox
(что эквивалентно шаблон firefox
).
Вот почему первый grep соответствует своей собственной командной строке процесса, а второй - нет.
Выражение в квадратных скобках является частью сопоставления с шаблоном класса символов 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