Как искать строку, содержащую все фразы с помощью egrep

#linux #bash #grep

#linux #bash #grep

Вопрос:

 egrep -c LOGIN wrapper.log|egrep -c failed wrapper.log 
|egrep -c '[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' wrapper.log
|egrep -cv mymathworks wrapper.log|egrep -cv nacmpa wrapper.log > failed-login.txt
 

Это то, что у меня есть в настоящее время. Мне нужно вернуть только количество строк в одном файле с ЛОГИНОМ, ошибкой, шаблоном ip-адреса и не содержать mymathworks или nacmpa.

Текущее регулярное выражение возвращает только количество строк в файле без nacmpa.

Комментарии:

1. Научитесь отлаживать свой код, создавая его по одному cmd за раз. Что такое вывод egrep -c LOGIN wrapper.log ? Тогда какой результат egrep -c LOGIN wrapper.log|egrep -c failed wrapper.log ? Имеет ли смысл этот вывод, если нет, исправьте это, прежде чем добавлять больше материала в (-; OK? Также смотрите Мой комментарий ниже о нескольких ссылках на wrapper.log (как правило, это не имеет смысла). Удачи.

Ответ №1:

-c Опция egrep выводит только количество, а не содержимое, т.Е. После LOGIN получения failed count количество никогда не будет совпадать (поскольку любое число не будет соответствовать тексту failed ). Разбиение вашего конвейера на части может помочь вам разобраться с этим.

Комментарии:

1. Я не был ясен в своем сообщении. Мне нужно только количество, а не содержимое. Цель состоит в том, чтобы добавить количество строк в файл, которые соответствуют всем указанным критериям. Это должно быть 801708 строк. Не могли бы вы пояснить, что вы имеете в виду, разбивая конвейер на части? Прямо сейчас, когда я запускаю весь скрипт, единственное количество, которое я получаю, — это -cv nacmpa

2. Кроме того, операционная система перечислила wrapper.log после каждого egrep target , но связана с | s . Разве это не должно быть только одно egrep srchTarget file | egrep anotherSrchTarg | egrep .... > outFile ? Удачи всем.

Ответ №2:

Краткий ответ: вы должны указывать только входной файл (wrapper.log) на первом egrep в строке списка, и вы должны указывать -c опцию только на последнем. Кроме того, я уверен, что вы могли бы упростить это, чтобы использовать меньше этапов конвейера.

Длинный ответ: Чтобы понять, что происходит не так, давайте посмотрим, что происходит на первых двух этапах конвейера. Первая команда в конвейере

 egrep -c LOGIN wrapper.log
 

…который выполняет поиск в wrapper.log и печатает количество строк, содержащих «LOGIN». Не строки, содержащие «LOGIN», а просто количество строк.

Следующая команда

 egrep -c failed wrapper.log
 

…который выполняет поиск в wrapper.log и выводит количество строк, содержащих «сбой». Он не считывает данные со своего ввода, поэтому вывод первого egrep полностью игнорируется. Даже если бы он ее прочитал, у него было бы только количество строк, поэтому не было бы способа определить, сколько из этих строк также содержало «сбой».

Решение: удалите -c из первого egrep , чтобы он печатал фактические совпадающие строки, и удалите wrapper.log из второго, чтобы он выполнял поиск выходных данных из первого egrep , а не возвращался и перечитывал исходный файл. Та же проблема возникает на всех других этапах конвейера, поэтому вам нужно удалить wrapper.log все, кроме первого (чтобы остальные действительно считывались из конвейера), и удалить -c все, кроме последнего (чтобы вы учитывали только после выполнения всей фильтрации).

Но, как я уже сказал, я подозреваю, что конвейер можно немного упростить. Всегда ли «LOGIN», «failed» и IP-адрес встречаются в строке в одном и том же порядке? Если это так, создайте единый шаблон, который включает в себя их все. Для «mymathworks» и «nacmpa» вы можете удалить оба сразу с помощью шаблона mymathworks|nacmpa . Итак, вы должны иметь возможность использовать что-то вроде этого:

 egrep 'LOGIN.*failed.*[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' wrapper.log 
| egrep -cv 'mymathworks|nacmpa'
 

Возможно, вам потребуется скорректировать первый шаблон, в зависимости от порядка расположения элементов и, возможно, от того, что должно быть между ними.