Подтвердить что ты не робот

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

Я пытаюсь использовать grep с -v для инвертированного совпадения вместе с -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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

EDIT: или, как отметил @Adam, вы можете использовать флаг -E:

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