Przekazuję listę wzorców wyrażeń regularnych grep
do sprawdzenia w pliku syslog. Zazwyczaj odpowiadają one adresowi IP i wpisowi do dziennika;
grep "1\.2\.3\.4.*Has exploded" syslog.log
To tylko lista wzorców, takich jak "1\.2\.3\.4.*Has exploded"
część, którą mijam, w pętli, więc nie mogę na przykład przekazać „-v”.
Jestem zdezorientowany, próbując wykonać odwrotność powyższego, NIE dopasuj wierszy z pewnym adresem IP i błędem, więc „! 1.2.3.4. * Eksplodował” dopasuje wiersze syslog dla czegoś innego niż 1.2.3.4, mówiąc mi, że wybuchł . I musi być w stanie jak IP, aby nie odpowiadać.
Widziałem różne podobne posty na StackOverflor, jednak używają wzorców wyrażeń regularnych, z którymi wydaje mi się, że nie mogę z nimi pracować grep
. Czy ktoś może podać działający przykład grep
?
AKTUALIZACJA: Dzieje się tak w takim skrypcie;
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"
zmianypatterns[3]="(?<!9\.10\.11\.12).*Has exploded"
igrep "${patterns[$i]}" logfile.log
zmiany wgrep -P "${patterns[$i]}" logfile.log
PCRE domyślnie zakładają więcej metaznaków, więc niektóre znaki specjalne mogą wymagać usunięcia z innych pasujących wyrażeń.Odpowiedzi:
grep
dopasowuje,grep -v
robi odwrotność. Jeśli potrzebujesz „dopasować A, ale nie B”, zwykle używasz rur:źródło
-v
i możesz używać go w pętli. Być może musisz sprecyzować swoje ograniczenia, a może masz nieporozumienie co do sposobu działania skryptu. Spróbuj opublikować kod.Musisz uruchomić to z opcją -P, aby mieć ujemny lookbehind (wyrażenie regularne Perl), więc polecenie to:
Spróbuj tego. Używa ujemnego wyglądu, aby zignorować linię, jeśli poprzedza ją
1.2.3.4
. Mam nadzieję, że to pomaga!źródło
grep
to nie obsługuje lookaround. Chyba że używasz Gnugrep
i nie używasz--P
parametru, aby użyć silnika PCRE.grep -P '(?<!1\.2\.3\.4) Has exploded' test.log
Zauważ, że lookbehind działa tylko na znaki bezpośrednio poprzedzające pasującą część wyrażenia, więc jeśli między adresem a wiadomością są inne rzeczy, np.1.2.3.4 FOO Has exploded
to nie zadziała..*
po negatywnym spojrzeniu jest po nim, ponieważ jego przykład również go ma, wyobrażam sobie, że może być inny tekst pomiędzy.powinien być taki sam jak
źródło