Grep regex ne contenant pas de chaîne

Je passe une liste de motifs regex à grep pour vérifier par rapport à 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 modèles comme la partie "1.2.3.4.*Has exploded" 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 ligne ne correspond pas avec une certaine adresse IP et une erreur si"!1.2.3.4.* A explosé " correspondra aux lignes syslog pour autre chose que 1.2.3.4 me disant qu'il a exploser. I doit Être capable d'inclure une adresse IP pour ne pas correspondre.

J'ai vu divers messages similaires sur StackOverflor mais ils utilisent des motifs regex que je n'arrive pas à utiliser avec grep. Quelqu'un peut-il fournir un exemple de travail pour grep svp?

Mise à jour: Cela se passe 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
121
demandé sur jwbensley 2012-05-02 14:06:39

3 réponses

grep correspond, grep -v fait l'inverse. Si vous avez besoin de "faire correspondre A mais pas B", vous utilisez généralement pipes:

grep "${PATT}" file | grep -v "${NOTPATT}"
216
répondu beerbajay 2012-05-02 10:10:13
(?<!1\.2\.3\.4).*Has exploded

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

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

Essayez ceci. Il utilise lookbehind négatif pour ignorer la ligne si elle est précédée par 1.2.3.4. Espérons que ça aide!

12
répondu Neil 2012-05-02 13:07:56
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"    
2
répondu krecker 2013-09-05 15:11:53