Ответ 1
grep
соответствует, grep -v
выполняет обратное. Если вам нужно "совместить A, но не B", вы обычно используете трубы:
grep "${PATT}" file | grep -v "${NOTPATT}"
Я передаю список шаблонов регулярных выражений grep
, чтобы проверить файл syslog. Обычно они соответствуют IP-адресу и записи в журнале;
grep "1\.2\.3\.4.*Has exploded" syslog.log
Это просто список шаблонов, таких как часть "1\.2\.3\.4.*Has exploded"
, которую я передаю, в цикле, поэтому я не могу передать "-v", например.
Я запутался, пытаясь сделать обратный вышеперечисленный, НЕ соответствует линиям с определенным IP-адресом и ошибкой, поэтому "! 1.2.3.4. * Взорвался" будет соответствовать линиям syslog для чего-либо, кроме 1.2.3.4, сообщая мне он взорвался. Я должен иметь возможность сопоставлять IP-адрес NOT.
Я видел разные подобные записи в StackOverflor, однако они используют шаблоны регулярных выражений, которые, как я, похоже, не могут работать с grep
. Может ли кто-нибудь предоставить рабочий пример для grep
, пожалуйста?
UPDATE: Это происходит в script следующим образом:
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
grep
соответствует, grep -v
выполняет обратное. Если вам нужно "совместить A, но не B", вы обычно используете трубы:
grep "${PATT}" file | grep -v "${NOTPATT}"
(?<!1\.2\.3\.4).*Has exploded
Вам нужно запустить это с -P, чтобы иметь отрицательный lookbehind (регулярное выражение Perl), поэтому команда:
grep -P '(?<!1\.2\.3\.4).*Has exploded' test.log
Попробуйте это. Он использует отрицательный lookbehind для игнорирования строки, если она предшествует 1.2.3.4
. Надеюсь, что это поможет!
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
должен быть таким же, как
egrep "(1\.2\.3\.4.*Has exploded|5\.6\.7\.8.*Has died)" logfile.log | egrep -v "9\.10\.11\.12.*Has exploded"