Як працює це [т] виразний дужковий вираз у грепі?


38

Нещодавно я бачив цей однопластовий:

$ 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 ....

[t] рик, схоже, перестає працювати!

Хтось тут буде знати, що відбувається, я впевнений.

Спасибі.


Хм, ти впевнений, що це правильно? ps -eaf | grep [fF] irefox мав би більше сенсу. Це виглядає як регулярний вираз і означає, що відповідає будь-якому із доданих символів. Можна зробити також у діапазоні, наприклад [0-9]
mbs

Ну так. З цією проблемою я мав: клас персонажів, що містить лише одного персонажа, здавався безглуздим, але створював "таємничий" побічний ефект! У будь-якому випадку, жокердіно дало хороше пояснення.
Торсен

Відповіді:


57

Вираз квадратної дужки є частиною відповідності шаблону символів класу bash (та інших оболонок) grep.

grepПрограма за замовчуванням розуміє POSIX основних регулярних виразів. За допомогою цього ви можете визначити класи символів. Наприклад ps -ef | grep [ab9]irefoxб знайти « в irefox», « б irefox», « 9 irefox» , якщо такі є, але не « аби irefox».

Команда grep [a-zA-Z0-9]irefoxнавіть знайде всі процеси, які починаються точно з однієї літери чи цифри і закінчуються "irefox".

Тож ps -ef | grep firefoxшукає рядки з firefoxним. Оскільки сам процес grep має "firefox", то grep знаходить і це. Додаючи a [], ми шукаємо лише клас символів "[f]" (який складається лише з літери "f" і для цього еквівалентний просто "f" без дужок). Перевага дужок тепер полягає в тому, що рядок "firefox" більше не відображається в команді grep. Отже, grep сам по собі не відображатиметься в результаті grep.

Оскільки не дуже багато людей знайомі з квадратними дужками як зіставленням класів символів та загальними регулярними виразами, другий результат може виглядати трохи таємничим.

Якщо ви хочете виправити другий результат, ви можете використовувати їх таким чином:

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

(Довідка)


1
Хм. Мені не прийшло в голову, що [] щось інтерпретується оболонкою ДО ПЕРЕД греп навіть отримає шанс. Дякую за пояснення. Усі [м] ітери розв’язані.
Торсен

Раді допомогти. Приємного дня :)
jokerdino

1
У bash квадратні дужки будуть передані в grep, якщо для слова, в якому вони знаходяться, немає (тобто в поточному каталозі немає файлу з іменем "firefox"). Однак, grep також має класи символів, і [f] у grep - це точно так само, як і f.
Данило Гершкович

6
Насправді в цьому випадку я не думаю, що це інтерпретується оболонкою перед грепом. Я думаю, що [f]це відповідна дужка регулярного виразу для класів символів. Як і в "[a-z0-9] irefox", grep також відповідатиме "airefox" і "0irefox". Ви можете легко побачити, що це не вбудований баш, оскільки echo $([f])повертає помилку.
con-f-use

4
Конкретна причина [f]irefoxроботи для цієї мети полягає в тому, що вона не розширюється оболонкою. Коли оболонка розгортається [f]irefoxдо firefox, це викликає grepпобачити firefox, а потім firefoxє частиною grepкомандного рядка, точно так, як ніби вони grep firefoxбули запущені. Але це добре , щоб зберегти оболонки зіставлення з зразком у вигляді , в зокрема , коли сценарії, тому що , якщо є файл з ім'ям firefoxв поточному каталозі , то оболонка має розширення [f]irefoxдоfirefox і цим методом не вдається, тобто, по grepлінії від psпоказаний.
Елія Каган

10

Причина в тому, що рядок

grep firefox

відповідає шаблону firefox, але рядок

grep [f]irefox

не відповідає шаблону [f]irefox(що еквівалентно шаблону firefox).

Тому перший grep відповідає власному командному рядку процесу, а другий - ні.


Це робить мою голову ще більшою
Пітікос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.