Как сделать вертикальную черту | работать в grep?


10

Вот пример командной строки grep, которую я пробовал:

grep '(565172|565173|565175)' /var/log/cups/error_log

Он не производит никакого вывода, даже если все 3 значения находятся в файле несколько раз.

Я попытался избежать баров, и это несколько улучшило ситуацию - было обнаружено среднее значение, но не первое или последнее.

grep '(565172\|565173\|565175)' /var/log/cups/error_log

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

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log

Что я делаю неправильно? Спасибо.

Ответы:


14

Синтаксис, который вы пытаетесь использовать, относится к расширенным регулярным выражениям, поэтому ответ очень прост: используйте egrepили включите -Eфлаг.


17

То, с чем вы сталкиваетесь, - это разница между базовыми и расширенными регулярными выражениями. Со страницы руководства grep:

В основных регулярных выражениях метасимволы?, +, {, |, (И) теряют свое особое значение; вместо этого используйте версии с обратной косой чертой \ ?, +, {, \ |, (и).

Таким образом, вы можете сделать одно из следующего:

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log

или

grep -E '(565172|565173|565175)' /var/log/cups/error_log

Флаг -E включает «Расширенные» регулярные выражения. GNU grep также поддерживает perl-совместимые регулярные выражения.


Отвлекся, когда писал мой ответ. Кажется, что Адам избил меня до удара.
Стивен Д.

4
Но вы добавили объяснение - причина, по которой я не смог заставить его работать, состоит в том, что я убегал только от бара, а не от паренов.
Марк Рэнсом

1
Я не знал, что вы можете избежать этих специальных символов еще раз, чтобы получить тот же результат, так что +1 для вас!
Адам Быртек

1
Выше приведен самый цивилизованный набор обменов, которые я когда-либо видел в SO / SE.
Майк Грызун
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.