Regex para encontrar a palavra 1 ou a palavra 2, mas não a palavra 3

-1

Eu tenho a seguinte mensagem:

Apr 12 12:48:02 poe true: sudo: nagios : command not allowed ; TTY=unknown ; PWD=/var/log/nagios ;

Como eu faço um regex que procure a palavra Sudo ou Comando mas não procure a palavra verdadeira? Razão de ser eu tenho outras mensagens que têm apenas as palavras sudo e comando e eu não estou interessado em ver as mensagens com a combinação dessas duas palavras com a terceira palavra. Eu até agora tentei:

1. (? =. * palavra1) (? =. * palavra2) 2. word1. * Word2

Ambos falharam em excluir a palavra que eu não quero. Basicamente eu quero que o conjunto resultante não consista nas mensagens que teriam word3 junto com word1 e word2, mas que o conjunto resultante tenha word1 ou word2.

Obrigado!

( Adicionado do comentário )

<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 

Se você pegar ambas as mensagens acima, quero que a regex corresponda à segunda mensagem, pois ela tem a palavra sudo , mas não corresponde à primeira mensagem, pois tem a palavra true nela. Estou interessado apenas no conjunto resultante sem a palavra TRUE . Embora essa primeira mensagem tenha Sudo , não quero essa mensagem.

    
por Tk_93 14.04.2017 / 04:15

1 resposta

0

Você está pedindo por isso

^(?!.*true).*$

A coisa (?!...) é um operador de look-ahead negativo que verifica se alguma palavra existe. Verifique aqui link

O crédito vai para esta pergunta da SO .

Você também pode usar um programa comum para verificar se ele contém a palavra true .

Assumindo que lines é uma matriz de mensagens de log, seria algo assim

lines.each do |line|
  puts line unless line.include?("true")
end

Espero que isso ajude.

    
por Anwar 14.04.2017 / 08:29