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
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}"
(?<!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!
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"