Je passe une liste de modèles regex à grep
pour le comparer à 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 motifs comme la partie "1\.2\.3\.4.*Has exploded"
que je passe en 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, un NON correspondance des lignes avec une certaine adresse IP et une erreur ainsi "! 1.2.3.4. * Has exploded" fera correspondre les lignes syslog pour tout ce qui est autre que 1.2.3.4 en me disant qu'il a explosé . Je doit être capable d'inclure une adresse IP pour ne pas correspondre.
J'ai vu divers articles similaires sur StackOverflor, mais ils utilisent des modèles de regex que je n'arrive pas à obtenir pour travailler avec grep
. Quelqu'un peut-il fournir un exemple de travail pour grep
s'il vous plaît?
PDATE: 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
grep
correspond, grep -v
fait l'inverse. Si vous devez "faire correspondre A mais pas B", vous utilisez généralement des pipes:
grep "${PATT}" file | grep -v "${NOTPATT}"
(?<!1\.2\.3\.4).*Has exploded
Vous devez exécuter ceci avec -P pour avoir une apparence négative (expression régulière Perl). La commande est donc:
grep -P '(?<!1\.2\.3\.4).*Has exploded' test.log
Essaye ça. Il utilise une recherche négative pour ignorer la ligne si celle-ci est précédée de 1.2.3.4
. J'espère que ça t'as aidé!
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"