Неправильный sed с regexp

У меня есть файл журнала. Я хочу почтовую рассылку извлечения от определенных строк. Демонстрационный файл журнала:

05:06:48,311  INFO http-nio-8080-exec-81 controller.IndexController:221 - Attempt to login: [xxx@yyy.com]. Headers: ["content-length": "52", ...]
15:06:48,311  INFO http-nio-8080-exec-81 controller.IndexController:221 - Attempt to login: [xxx@yyy.com]. Headers: ["content-length": "52", ...]
09:40:21,187  INFO http-nio-8080-exec-31 security.AuthAuthenticationProvider:81 - User: [16167]. Wrong code. Telegram: [0]. Google: [0]

Мой сценарий:

cat file.log | sed -r 's/.*Attempt to login: \[(.*)\]\..*/\1/' | sort | uniq > file.log.filtered.txt

Я получаю file.log.filtered.txt:

09:40:21,187  INFO http-nio-8080-exec-31 security.AuthAuthenticationProvider:81 - User: [16167]. Wrong code. Telegram: [0]. Google: [0]
xxx@yyy.com

Почему у меня есть строка с "AuthAuthenticationProvider" в фильтрованном файле?

0
задан 20 August 2018 в 00:36

1 ответ

Поскольку Вы выполняете Ваш sed управляйте только на строках, который содержит: Attempt to login таким образом, другие строки останутся нетронутыми.

Можно изменить код как это:

grep 'Attempt' file.log | sed -r 's/.*Attempt to login: \[(.*)\]\..*/\1/' | sort | uniq > file.log.filtered.txt

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

или этот:

sed -re 's/.*Attempt to login: \[(.*@.*)\]\..*/\1/;t;d' file.log | sort | uniq

или даже этот:

sed -nr 's/.*Attempt to login: \[(.*@.*)\]\..*/\1/p' file.log | sort | uniq

Или просто используйте grep:

grep 'Attempt' file.log | grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' | sort | uniq

Regex для последней команды формируются здесь

5
ответ дан 28 October 2019 в 03:00

Другие вопросы по тегам:

Похожие вопросы: