#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'
Возможно, вам потребуется скорректировать первый шаблон, в зависимости от порядка расположения элементов и, возможно, от того, что должно быть между ними.