Je passe une liste de modèles de 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 motifs comme la "1\.2\.3\.4.*Has exploded"
partie 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, et de NE PAS faire correspondre les lignes avec une certaine adresse IP et une certaine erreur, donc "! 1.2.3.4. * A explosé" correspondra aux lignes syslog pour autre chose que 1.2.3.4 m'indiquant qu'il a explosé . Je dois pouvoir inclure une adresse IP pour ne PAS correspondre.
J'ai vu divers articles similaires sur StackOverflow. Cependant, ils utilisent des modèles de regex avec lesquels je n'arrive pas à travailler grep
. Quelqu'un peut-il fournir un exemple de travail pour grep
s'il vous plaît?
MISE À JOUR: Cela se produit 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
patterns[3]="\!9\.10\.11\.12.*Has exploded"
modificationspatterns[3]="(?<!9\.10\.11\.12).*Has exploded"
et lesgrep "${patterns[$i]}" logfile.log
modifications apportées àgrep -P "${patterns[$i]}" logfile.log
PCRE supposent plus de métacaractères par défaut, de sorte que certains des échappements doivent être supprimés d'autres expressions correspondantes.Réponses:
grep
correspond,grep -v
fait l'inverse. Si vous devez "faire correspondre A mais pas B", vous utilisez généralement des tubes:grep "${PATT}" file | grep -v "${NOTPATT}"
la source
-v
et vous pouvez l'utiliser en boucle. Vous devez peut-être être plus précis sur vos limites, ou peut-être avez-vous une idée fausse sur la façon dont votre script devrait fonctionner. Essayez de publier du code.(?<!1\.2\.3\.4).*Has exploded
Vous devez exécuter ceci avec -P pour avoir une recherche négative (expression régulière Perl), donc la commande est:
grep -P '(?<!1\.2\.3\.4).*Has exploded' test.log
Essaye ça. Il utilise la recherche négative en arrière pour ignorer la ligne si elle est précédée de
1.2.3.4
. J'espère que ça t'as aidé!la source
grep
cela ne prend pas en charge le lookaround. Sauf si vous utilisez Gnugrep
et utilisez le--P
paramètre pour lui faire utiliser un moteur PCRE.grep -P '(?<!1\.2\.3\.4) Has exploded' test.log
notez que le lookbehind ne fonctionne que sur les caractères précédant immédiatement la partie correspondante de l'expression, donc s'il y a d'autres choses entre l'adresse et le message, par exemple1.2.3.4 FOO Has exploded
, cela ne fonctionnera pas..*
après le regard négatif puisque son exemple l'a également, j'imagine qu'il pourrait y avoir un autre texte entre les deux.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"
la source