Я передаю список шаблонов регулярных выражений grep
для сравнения с файлом системного журнала . Они обычно соответствуют IP-адресу и записи в журнале;
grep "1\.2\.3\.4.*Has exploded" syslog.log
Это просто список шаблонов, таких как "1\.2\.3\.4.*Has exploded"
часть, которую я передаю в цикле, поэтому я не могу передать, например, «-v».
Я запутался, пытаясь сделать обратное вышесказанному, строки НЕ совпадают с определенным IP-адресом и ошибкой, поэтому «! 1.2.3.4. * Разорвал» будет сопоставлять строки системного журнала для всего, кроме 1.2.3.4, сообщая мне, что он взорвался , Я должен иметь возможность включить IP, чтобы не совпадать.
Я видел различные подобные посты в StackOverflor, однако они используют шаблоны регулярных выражений, с которыми я не могу работать grep
. Кто-нибудь может привести рабочий пример для 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
patterns[3]="\!9\.10\.11\.12.*Has exploded"
измененияpatterns[3]="(?<!9\.10\.11\.12).*Has exploded"
иgrep "${patterns[$i]}" logfile.log
изменений вgrep -P "${patterns[$i]}" logfile.log
PCRE по умолчанию предполагается большее количество метасимволов, поэтому, возможно, придется удалить некоторые экранированные из других соответствующих выражений.Ответы:
grep
соответствует,grep -v
делает обратное. Если вам нужно «соответствовать A, но не B», вы обычно используете трубы:источник
-v
и вы можете использовать его в цикле. Возможно, вам нужно быть более точным в отношении ваших ограничений, или, возможно, у вас неправильное представление о том, как должен работать ваш скрипт. Попробуйте опубликовать код.Вам нужно запустить это с -P, чтобы иметь отрицательный lookbehind (регулярное выражение Perl), поэтому команда:
Попробуй это. Он использует отрицательный взгляд назад, чтобы игнорировать строку, если ей предшествует
1.2.3.4
. Надеюсь, это поможет!источник
grep
это не поддерживает lookaround. Если вы не используете Gnugrep
и не используете--P
параметр, чтобы он использовал механизм PCRE.grep -P '(?<!1\.2\.3\.4) Has exploded' test.log
обратите внимание, что lookbehind работает только с символами, непосредственно предшествующими соответствующей части выражения, поэтому, если есть другие вещи между адресом и сообщением, например1.2.3.4 FOO Has exploded
, это не будет работать..*
после негативного взгляда есть след, поскольку в его примере это тоже есть, я думаю, что между ними может быть другой текст.должен быть таким же, как
источник