Grep регулярное выражение НЕ содержит строку

Я передаю список шаблонов регулярных выраженийgrep проверить на файл системного журнала. Они обычно соответствуют IP-адресу и записи в журнале;

<code>grep "1\.2\.3\.4.*Has exploded" syslog.log
</code>

Это просто список шаблонов, таких как"1\.2\.3\.4.*Has exploded" часть, которую я передаю, в цикле, так что я не могу "пройти" -v " например.

Я запутался, пытаясь сделать обратное вышеописанному, строки НЕ сопоставляются с определенным IP-адресом и ошибкой, поэтому & quot;! 1.2.3.4. * Взорвалась & quot; будет соответствовать строкам системного журнала для чего-либо кроме 1.2.3.4, говорящего мне, что это взорвалось. яmust быть в состоянии включить IP, чтобы не совпадать.

Я видел различные подобные посты в StackOverflor, однако они используют шаблоны регулярных выражений, с которыми я, похоже, не могу работатьgrep, Может ли кто-нибудь привести рабочий пример дляgrep пожалуйста?

UPDATE: Это происходит в таком сценарии;

<code>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
</code>
 beerbajay02 мая 2012 г., 14:57
Если вы абсолютно обязаны сделать это в одном утверждении, негативные взгляды - это путь, как предлагает Нейл. Смотрите мой комментарий там.
 jwbensley02 мая 2012 г., 14:06
Ну, я не очень разбираюсь в регулярных выражениях; Я не хочу указывать на "Взорвался" потому что я не хочу знать это о каждом регистрирующем устройстве, поэтому могу ли я как-то найти "Разорвал" и! 9.10.11.12 в одном утверждении?
 beerbajay02 мая 2012 г., 12:42
Ты имеешь ввидуsometimes хочу соответствовать шаблону, но в других случаях хочу соответствовать всемexcept определенный шаблон? (это кажется странным требованием, но неважно). В таком случае, почему бы вам не выполнить итерацию по двум разным спискам шаблонов?

Ответы на вопрос(3)

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

чтобы иметь отрицательный lookbehind (регулярное выражение Perl), поэтому команда:

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

Попробуй это. Он использует отрицательный взгляд назад, чтобы игнорировать строку, если ей предшествует1.2.3.4, Надеюсь, это поможет!

 02 мая 2012 г., 14:57
правильное цитирование:grep -P '(?<!1\.2\.3\.4) Has exploded' test.log Обратите внимание, что просмотр сзади работает только с символами, непосредственно предшествующими соответствующей части выражения, поэтому, если между адресом и сообщением есть другие вещи, например,1.2.3.4 FOO Has explodedэто не сработает.
 02 мая 2012 г., 12:26
Вам понадобится процитировать регулярное выражение, если оно содержит символы, которые будут интерпретироваться оболочкой.
 02 мая 2012 г., 15:01
@TimPietzcker, очень наблюдательный. Я добавлю это к вопросу. Также обратите внимание, что есть.* после того, как у его примера есть отрицательный взгляд, я думаю, что между ними может быть другой текст.
 jwbensley02 мая 2012 г., 12:20
Нет, grep не поддерживает этот тип регулярных выражений; $ grep -P (? & lt; \! 1 \ .2 \ .3 \ .4) test.log -bash: синтаксическая ошибка рядом с неожиданным токеном `(& apos;
 02 мая 2012 г., 12:15
Я уверен, чтоgrep не поддерживает внешний вид. Если вы не используете Gnugrep и использовать--P параметр, чтобы заставить его использовать движок PCRE.
Решение Вопроса

grep Матчи,grep -v делает обратное. Если вам нужно "сопоставить A, но не B" Вы обычно используете трубы:

 02 дек. 2015 г., 21:25
Но что, если A состоит из B? Другими словами, что если я хочу сопоставить строки сno and линии с АБ? Труба не будет работать.
 02 мая 2012 г., 12:25
Вы действительно можете использовать-v и вы можете использовать его в цикле. Возможно, вам нужно быть более точным в отношении ваших ограничений, или, возможно, у вас неправильное представление о том, как должен работать ваш скрипт. Попробуйте опубликовать некоторый код.
 jwbensley02 мая 2012 г., 12:36
Спасибо beerbajay, я добавил код, вырезанный в оригинальном сообщении, чтобы дать некоторый контекст. Вы понимаете, что я имею в виду сейчас?
 jwbensley03 мая 2012 г., 18:05
Этот ответ не совсем правильный, но вы в значительной степени написали beerbajay, мне нужно было переосмыслить цикл и использовать -v в конце. Спасибо за указатель;)
 jwbensley02 мая 2012 г., 12:21
Это входит в середину цикла, как я уже говорил, и я просто передаю PATTERN в grep, чтобы я мог "использовать" -v ". как я уже заметил. Я просто зацикливаю список паттернов и перехожу на grep.
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"    

Ваш ответ на вопрос