Regex Grep ne contenant pas de chaîne

Je passe une liste de modèles de regex à grep pour vérifier avec un fichier syslog. Ils correspondent généralement à une adresse IP et à une entrée de journal.

 grep "1\.2\.3\.4.*Has exploded" syslog.log 

C’est juste une liste de patterns comme "1\.2\.3\.4.*Has exploded" partie que je passe, dans une boucle, donc je ne peux pas passer “-v” par exemple.

Je suis confus en essayant de faire l’inverse de ce qui précède, une correspondance avec les lignes avec une certaine adresse IP et une erreur afin “! 1.2.3.4. * A éclaté” correspondra aux lignes syslog pour autre chose que 1.2.3.4 me disant qu’il a explosé . Je dois pouvoir inclure une adresse IP pour ne pas correspondre.

J’ai vu plusieurs articles similaires sur StackOverflor, mais ils utilisent des modèles de regex que je n’arrive pas à utiliser avec grep . Quelqu’un peut-il fournir un exemple de travail pour grep s’il vous plaît?

UPDATE: Cela se produit dans un script comme celui-ci;

 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 

correspond à grep , grep -v fait l’inverse. Si vous devez “correspondre à A mais pas à B”, vous utilisez généralement des tuyaux:

 grep "${PATT}" file | grep -v "${NOTPATT}" 
 (?< !1\.2\.3\.4).*Has exploded 

Vous devez l'exécuter avec -P pour avoir un lookbehind négatif (expression régulière Perl), la commande est donc:

 grep -P '(?< !1\.2\.3\.4).*Has exploded' test.log 

Essaye ça. Il utilise un lookbehind négatif pour ignorer la ligne si elle est précédée de 1.2.3.4 . J'espère que cela pourra aider!

 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 

devrait être le même que

 egrep "(1\.2\.3\.4.*Has exploded|5\.6\.7\.8.*Has died)" logfile.log | egrep -v "9\.10\.11\.12.*Has exploded"