Использование grep с регулярным выражением для фильтрации совпадений - PullRequest
40 голосов
/ 12 декабря 2008

Я пытаюсь использовать 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

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

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

Ответы [ 2 ]

62 голосов
/ 12 декабря 2008

Проблема в том, что по умолчанию вам нужно экранировать свои |, чтобы получить правильное чередование. То есть, 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 автоматически принимает первый не опциональный аргумент в качестве шаблона.

5 голосов
/ 12 декабря 2008

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

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

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

tail -f logFile | grep -vE "string one|string two"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...