web-dev-qa-db-fra.com

Grep regex ne contenant pas de chaîne

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
154
jwbensley

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

15
Neil
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
krecker