2013-03-13 3 views
0

Я имею дело с проблемой, что я не знаю, можно ли решить этот путь, надеюсь, что вы можете мне помочь. Давайте посмотрим:Регулярное выражение для соответствия, если строки X содержат слово?

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

Файл журнала в вопросе выглядит следующим образом:

[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] [SEVERE]  :: Exception was caught: Could not bind to port.. Exiting. 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] [SEVERE]  :: Exception was caught: Could not bind to port.. Exiting. 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] [SEVERE]  :: Exception was caught: Could not bind to port.. Exiting. 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] Configurator :: FillSensor() 
[2013/03/12-16:07:06] [SEVERE]  :: Exception was caught: Could not bind to port.. Exiting. 
[2013/03/12-16:07:06] Configurator :: FillSensor() 

И я ищу для "[ТЯЖЕЛОГО]" выражения.

Я хочу совпадение, если это выражение появляется более трех раз.

Я знаю, что .*\[SEVERE\].* дает мне все строки, соответствующие этому выражению, но я хочу только соответствовать, если это число строк равно 3 или более. Есть ли способ сделать это с помощью регулярных выражений? Или альтернатива сделать это с Монитом, возможно?

+1

Прочитайте в каждой строке своего файла журнала отдельно, а затем, когда вы получите 3 совпадения, верните весь файл в соответствие. – Michael

+1

Другой способ - использовать 'grep' для выделения строк, а затем использовать' wc' для подсчета строк, соответствующих словам. – nhahtdh

+0

Я думаю, что, к сожалению, эти варианты выходят за рамки Монита, я не прав? – catteneo

ответ

2

Если вы можете получить доступ к файлам журнал в дееспособной оболочке:

[ $(cat LOG.txt | grep "\[SEVERE\]" | wc -l) -ge 3 ] 

Это трубы содержимого файла в grep, который ищет строки, содержащие «[СЕРЬЕЗНЫЕ]», затем wc подсчитывает количество строк и выражение возвращает 0, если количество строк больше или равно 3.

+0

Да, я думаю, лучший вариант для этого - вне Monit, с чем-то вроде вашего решения. благодаря – catteneo

Смежные вопросы