Использование grep с регулярным выражением для фильтрации совпадений

Я пытаюсь использовать grep с -v для invert-match вместе с -e для регулярного выражения. У меня проблемы с получением правильного синтаксиса.

Я пытаюсь что-то вроде

tail -f logFile | grep -ve "string one|string two"

Если я делаю это таким образом, это не фильтрует, если я изменяю это на

tail -f logFile | grep -ev "string one|string two"

я получил

grep: string one|string two: No such file or directory

Я пытался использовать () или кавычки, но не смог найти ничего, что работает.

Как я могу это сделать?

47 grep
12.12.2008 20:53:05
2 ОТВЕТА
РЕШЕНИЕ

Проблема в том, что по умолчанию вам нужно экранировать свои |, чтобы получить правильное чередование. То есть, grep интерпретирует «foo | bar» как совпадающее только с литеральной строкой «foo | bar», тогда как шаблон «foo \ | bar» (с экранированным символом |) соответствует либо «foo», либо «bar».

Чтобы изменить это поведение, используйте флаг -E:

tail -f logFile | grep -vE 'string one|string two'

В качестве альтернативы используйте egrep, что эквивалентно grep -E:

tail -f logFile | egrep -v 'string one|string two'

Кроме того, -e является необязательным, если ваш шаблон не начинается с буквального дефиса. grep автоматически принимает первый не опциональный аргумент в качестве шаблона.

72
12.12.2008 20:57:06
хех, узнай что-то новое каждый день, я никогда раньше не замечал флаг -E на grep.
Jay 12.12.2008 20:58:48
это решение работает для MacOS? Я пытаюсь, history | grep -vE 'ng|npm'но это не работает, как ожидалось.
Sergii 2.01.2018 06:04:21
@Sergii: Да, версия Grep в комплекте с MacOS (BSD Grep) полностью поддерживает -vи -Eфлаги. «Не работает» - расплывчатое описание, вам придется предоставить более подробную информацию. Я предлагаю вам задать новый вопрос, а не размещать в комментариях здесь.
Adam Rosenfield 31.01.2018 21:45:41

Вам нужно экранировать символ трубы, когда используется -e:

tail -f logFile | grep -ve "string one\|string two"

РЕДАКТИРОВАТЬ: или, как указал @Adam , вы можете использовать флаг -E:

tail -f logFile | grep -vE "string one|string two"
6
23.05.2017 12:32:08
Я протестировал первую часть своей системы, и она дала желаемые результаты. Не уверен, что вы имеете в виду под неточным.
Jay 15.12.2008 19:53:35