Я видел эту однострочную:
$ ps -ef | grep [f]irefox
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ...
Таким образом, кажется, что он возвращает список процессов с «firefox» в данных, но опускает сам процесс 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 ....
[т] Рик, кажется, перестает работать!
Кто-то здесь будет знать, что происходит, я уверен.
Спасибо.
command-line
bash
grep
Торсен
источник
источник
Ответы:
Выражение в квадратных скобках является частью соответствия шаблонов классов символов grep
(а также других оболочек).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 также находит это. Добавляя a[]
, мы ищем только класс символов "[f]" (который состоит только из буквы "f" и поэтому эквивалентен просто "f" без скобок). Преимущество скобок теперь состоит в том, что строка «firefox» больше не появляется в команде grep. Следовательно, сам grep не будет отображаться в результате поиска.Поскольку не так много людей знакомы с квадратными скобками, такими как сопоставление классов символов и регулярные выражения в целом, второй результат может показаться немного загадочным.
Если вы хотите исправить второй результат, вы можете использовать их следующим образом:
(Ссылка)
источник
[f]
это скобка соответствия шаблону регулярного выражения для классов символов. Как и в «[a-z0-9] irefox», grep будет также соответствовать «airefox» и «0irefox». Вы можете легко увидеть, что это не встроенный bash, так какecho $([f])
возвращает ошибку.[f]irefox
работает для этой цели в том, что она не раскрывается оболочкой. Когда оболочка расширяется[f]irefox
доfirefox
, это заставляетgrep
видетьfirefox
, а затемfirefox
является частьюgrep
командной строки России, точно так же, как если бы ониgrep firefox
были запущены. Но это хорошо , чтобы сохранить оболочки сопоставления с образцом в виде , в частности , когда сценарии, потому что , если есть файл с именемfirefox
в текущем каталоге , то оболочка имеет расширение[f]irefox
кfirefox
и этому методу не удается, то есть, поgrep
линии отps
показан.Причина в том, что строка
соответствует шаблону
firefox
, но строкане соответствует шаблону
[f]irefox
(что эквивалентно шаблонуfirefox
).Вот почему первый grep соответствует собственной командной строке процесса, а второй - нет.
источник