Ich übergebe eine Liste von Regex-Mustern grep
, um sie mit einer Syslog-Datei zu vergleichen. Sie stimmen normalerweise mit einer IP-Adresse und einem Protokolleintrag überein.
grep "1\.2\.3\.4.*Has exploded" syslog.log
Es ist nur eine Liste von Mustern wie der "1\.2\.3\.4.*Has exploded"
Teil, den ich übergebe, in einer Schleife, sodass ich zum Beispiel nicht "-v" übergeben kann.
Ich bin verwirrt, wenn ich versuche, das Gegenteil von oben zu tun. Eine NICHT übereinstimmende Zeile mit einer bestimmten IP-Adresse und einem bestimmten Fehler, sodass "! 1.2.3.4. * Ist explodiert" mit Syslog-Zeilen für alles andere als 1.2.3.4 übereinstimmt und mir mitteilt, dass sie explodiert ist . Ich muss in der Lage sein, eine IP anzugeben, die NICHT übereinstimmt.
Ich habe verschiedene ähnliche Beiträge auf StackOverflor gesehen, aber sie verwenden Regex-Muster, mit denen ich scheinbar nicht arbeiten kann grep
. Kann jemand grep
bitte ein funktionierendes Beispiel dafür geben ?
UPDATE: Dies geschieht in einem Skript wie diesem.
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"
Änderungen anpatterns[3]="(?<!9\.10\.11\.12).*Has exploded"
undgrep "${patterns[$i]}" logfile.log
Änderungen angrep -P "${patterns[$i]}" logfile.log
PCRE setzen standardmäßig mehr Metazeichen voraus, sodass einige der Escapezeichen möglicherweise aus anderen übereinstimmenden Ausdrücken entfernt werden müssen.Antworten:
grep
passt,grep -v
macht das Gegenteil. Wenn Sie "A, aber nicht B" anpassen müssen, verwenden Sie normalerweise Rohre:quelle
-v
und Sie können es in einer Schleife verwenden. Möglicherweise müssen Sie Ihre Einschränkungen genauer beschreiben, oder Sie haben eine falsche Vorstellung davon, wie Ihr Skript funktionieren soll. Versuchen Sie, einen Code zu veröffentlichen.Sie müssen dies mit -P ausführen, um ein negatives Aussehen zu erhalten (regulärer Perl-Ausdruck). Der Befehl lautet also:
Versuche dies. Es verwendet negatives Lookbehind, um die Zeile zu ignorieren, wenn sie vorangestellt ist
1.2.3.4
. Hoffentlich hilft das!quelle
grep
das Lookaround nicht unterstützt. Es sei denn, Sie verwenden Gnugrep
und verwenden den--P
Parameter, um eine PCRE-Engine zu verwenden.grep -P '(?<!1\.2\.3\.4) Has exploded' test.log
Anführungszeichen : Beachten Sie, dass das Lookbehind nur für die Zeichen unmittelbar vor dem übereinstimmenden Teil des Ausdrucks1.2.3.4 FOO Has exploded
funktioniert. Wenn also zwischen Adresse und Nachricht andere Dinge stehen, z. B. funktioniert dies nicht..*
nach dem negativen Look ein Verhalten gibt, da sein Beispiel es auch hat. Ich kann mir vorstellen, dass dazwischen ein anderer Text liegt.sollte das gleiche sein wie
quelle