Estou passando uma lista de padrões de regex grep
para verificar em um arquivo syslog. Eles geralmente correspondem a um endereço IP e uma entrada de log;
grep "1\.2\.3\.4.*Has exploded" syslog.log
É apenas uma lista de padrões como a "1\.2\.3\.4.*Has exploded"
parte que estou passando, em um loop, então não posso passar "-v" por exemplo.
Estou confuso ao tentar fazer o inverso do exposto acima, um NÃO corresponde a linhas com um determinado endereço IP e erro, de modo que "! 1.2.3.4. * Explosion" corresponderá às linhas do syslog para algo diferente de 1.2.3.4, informando que ele explodiu . I deve ser capaz de incluir um IP para não coincidem.
Eu já vi vários posts semelhantes no StackOverflor, no entanto, eles usam padrões regex com os quais não consigo trabalhar grep
. Alguém pode dar um exemplo de trabalho, por grep
favor?
UPDATE: Isso está acontecendo em um script como este;
patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"
for i in {1..3}
do
grep "${patterns[$i]}" logfile.log
done
patterns[3]="\!9\.10\.11\.12.*Has exploded"
alteraçõespatterns[3]="(?<!9\.10\.11\.12).*Has exploded"
e asgrep "${patterns[$i]}" logfile.log
alterações nogrep -P "${patterns[$i]}" logfile.log
PCRE assumem mais metacaracteres por padrão, portanto, algumas fugas podem precisar ser removidas de outras expressões correspondentes.Respostas:
grep
corresponde,grep -v
faz o inverso. Se você precisa "combinar A, mas não B", normalmente usa tubos:fonte
-v
e pode usá-lo em um loop. Talvez você precise ser mais específico sobre suas limitações, ou talvez tenha um equívoco sobre como seu script deve funcionar. Tente postar algum código.Você precisa executar isso com -P para ter uma aparência negativa (expressão regular do Perl); portanto, o comando é:
Tente isso. Ele usa lookbehind negativo para ignorar a linha, se for precedida por
1.2.3.4
. Espero que ajude!fonte
grep
isso não é compatível. A menos que você esteja usando o Gnugrep
e use o--P
parâmetro para fazê-lo usar um mecanismo PCRE.grep -P '(?<!1\.2\.3\.4) Has exploded' test.log
Observe que o lookbehind funciona apenas nos caracteres imediatamente anteriores à parte correspondente da expressão; portanto, se houver outras coisas entre o endereço e a mensagem, por exemplo1.2.3.4 FOO Has exploded
, isso não funcionará..*
aspecto negativo depois que o exemplo dele também o possui, imagino que possa haver outro texto no meio.deve ser o mesmo que
fonte