У меня есть следующее сообщение:
Apr 12 12:48:02 poe true: sudo: nagios : command not allowed ; TTY=unknown ; PWD=/var/log/nagios
;
Как создать регулярное выражение, которое ищет слово «Судо» или «Команда», но не ищет слово «истина»? Причина в том, что у меня есть другие сообщения, в которых есть только слова sudo и command, и мне не интересно просматривать сообщения с комбинацией этих двух слов с этим третьим словом. До сих пор я пытался:
1. (? =. * Word1) (? =. * Word2) 2. word1. * Word2
Они оба не смогли отловить слово, которое я не хочу По сути, я хочу, чтобы результирующий набор не состоял из тех сообщений, которые имели бы слово 3 вместе с word1 и word2, но хотел бы, чтобы результирующий набор имел либо word1, либо word2.
Спасибо!
( Добавлено из комментария )
<30>Jun 11 12:42:02 true:/var/ossec/logs/alerts/alerts.log Apr 12 12:48:01 duffy sudo: nagios : command not allowed ; TTY=unknown ; PWD=/var/log/nagios;
<85>Apr 11 12:00:46 verne sudo: ndakjs2 : TTY=pts/0 ; PWD=/Defactor/2/rules/claimsfactor ; USER=NONE; COMMAND
Если вы возьмете оба вышеуказанных сообщения, я хочу, чтобы регулярное выражение совпадало со вторым сообщение, поскольку в нем есть слово sudo
, но оно не совпадает с первым сообщением, поскольку в нем есть слово true
. Меня интересует только результирующий набор без слова TRUE
. Хотя это первое сообщение имеет Sudo
, я не хочу это сообщение.
Вы просите об этом
^(?!.*true).*$
Вещество (?!...)
является оператором с отрицательным прогнозом, который проверяет, существует ли какое-либо слово. Проверьте это здесь http://rubular.com/r/aYzwcfekrI
Кредит идет на этот вопрос SO .
Вы также можете просто использовать обычную программу, чтобы проверить, содержит ли она слово true
.
Предполагая, что lines
является массивом сообщений журнала, это будет что-то вроде этого
lines.each do |line|
puts line unless line.include?("true")
end
Надеюсь, это поможет.