231 votes

Grep regex ne contenant PAS de chaîne

Je suis de passage d'une liste de modèles regex pour grep pour vérifier la présence d'un fichier syslog. Ils sont généralement correspondant à une adresse IP et l'entrée du journal;

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

C'est juste une liste de modèles comme l' "1\.2\.3\.4.*Has exploded" part je suis de passage, dans une boucle, donc je ne peux pas passer "-v" par exemple.

Je suis confus d'essayer de faire l'inverse de ce qui précède, un NON match des lignes avec une certaine adresse IP et erreur tellement "!1.2.3.4.*A explosé" correspond à syslog lignes pour rien d'autre que 1.2.3.4 à me dire qu'il a explosé. Je doit être en mesure d'inclure un IP de ne PAS correspondre.

J'ai vu plusieurs des postes similaires sur StackOverflor cependant ils utilisent des modèles regex que je n'arrive pas à obtenir de travailler avec grep. Quelqu'un peut-il fournir un exemple pour grep s'il vous plaît?

Mise à JOUR: Ce qui 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

442voto

beerbajay Points 6120

grep correspond à, grep -v t l'inverse. Si vous avez besoin de "match A mais pas B" que vous utilisez habituellement des tuyaux:

grep "${PATT}" file | grep -v "${NOTPATT}"

17voto

Neil Points 3122
(?<!1\.2\.3\.4).*Has exploded

Vous devez exécuter ce avec -P pour avoir le négatif lookbehind (expression régulière Perl), de sorte que la commande est:

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

Essayez ceci. Il utilise négatif lookbehind d'ignorer la ligne s'il est précédé par" 1.2.3.4. Espérons que ça aide!

2voto

krecker Points 21
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

doit ê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"    

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X