Как можно сопоставить мое регулярное выражение с нежелательной строкой? - PullRequest
0 голосов
/ 03 октября 2018

Сначала я хотел бы уточнить контекст моего вопроса.Я должен проявить себя на собеседовании, и собеседование имитирует реальный мир, и я могу проконсультироваться с кем угодно, сделать что угодно, ожидаю, что я должен найти правильный ответ.Я решил много вещей, но с этим я застрял из-за того, что я не очень хорошо разбираюсь ни в регулярных выражениях, ни в командной строке Linux.Я должен решить эту задачу:

Представьте, что вы просматриваете файл журнала с tail -f.Передайте это в вызов grep, который фильтрует ввод хвоста и показывает только строки, соответствующие сегодняшней дате, в формате «ГГГГ-ММ-ДД» в начале строки (для любого будущего «сегодня») и содержит строку «[error.critical]в любой капитализации.Будьте осторожны с деталями;соответствие должно быть точно таким, как описано здесь.

Для этой цели я создал файл с именем log с этим содержимым для целей тестирования:

2018-10-03 [erroR.critical] sadkhasdhaksd

2018-10-03 sadkhasdhaksd [error.critical]

2018-10-03 sadkhasdhaksd [error.noncritical]

2018-10-26 sadkhasdhaksd [error.critical]

2018-10-03 красный сигнал [Error.critical]

2018-10-03 красный сигнал error.critical красный сигнал

2018-10-03 [error.critical]

Я придумала это решение:

tail -f log | grep -io "^$(date +"%Y-%m-%d")".*\\[error.critical\\]

Однако они сказали, что могут представить два вида строк, которые будутнеправильно соответствовать этому регулярному выражению.Я понял следующие проблемы:

  • Я не установил пробел после даты
  • Я не правильно выписал результат, так как после [error.critical] должен быть выведен дополнительный текст
  • Возможно, я тоже ошибся с цитатой, не помещая ее в конец строки

Опять же, я не очень хорошо разбираюсь в регулярных выражениях или командной строке Linux.Текущий подход -

tail -f log | grep -io "^$(date +"%Y-%m-%d") .*\\[error.critical\\].*"

, где все проблемы, о которых я узнал после тщательного рассмотрения, были исправлены.Тем не менее, они сказали, что первое регулярное выражение, которое я придумал, может соответствовать двум типам строк, которые не должны быть в результате.Я реализовал один из этих типов (без пробела), но я не знаю, какой другой тип строки ошибочно соответствует моему регулярному выражению.Можете ли вы сказать мне, какая строка будет неправильно соответствовать первому регулярному выражению, кроме тех, которые пропускают пробел после даты?

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете использовать это grep:

tail -f log | grep -i "^$(date '+%Y-%m-%d') .*\[error\.critical]"

2018-10-03 [erroR.critical]sadkhasdhaksd
2018-10-03 sadkhasdhaksd [error.critical]
2018-10-03 red alert [Error.critical]
2018-10-03 [error.critical]

  • Это регулярное выражение соответствует пробелу после сегодняшней даты в начале.
  • . должен быть экранирован, иначе он соответствует любому символу.
  • Нет необходимости удваивать escape [ и . в BRE.
  • Escape ] isдополнительная опция
  • -o используется для извлечения только совпадающего текста, поэтому ее можно избежать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...