Такую проблему - сопоставление с образцом в тексте - можно решить с помощью регулярных выражений (реализовано в модуле re в стандартной библиотеке Python).
Давайтескажем, у нас есть строки из вопроса, собранные в списке:
>>> print(lines)
['May 26 06:25:01 instance-1 CRON[19549]: pam_unix(cron:session): session closed for user root', 'May 26 06:38:14 instance-1 sshd[19783]: Connection closed by 210.187.175.103 port 60536 [preauth]', 'May 26 06:39:05 instance-1 sshd[19797]: Invalid user backups from 182.254.146.167 port 58682', 'May 26 06:39:05 instance-1 sshd[19797]: input_userauth_request: invalid user backups [preauth]']
Давайте импортируем модуль re и определим шаблон для сопоставления
>>> import re
>>> pattern = r'[Ii]nvalid user\s+(\w+)\s+'
Шаблон для сопоставления:
- либо «I», либо «i», за которым следует «nvalid»
- , за которым следует хотя бы один пробельный символ
- , за которым следует подшаблон в скобках: хотя бы один символ, который может составлять слово (в данном случае имя пользователя)
- хотя бы один символ пробела
Теперь мы ищем шаблон в каждой строке:
>>> matches = [re.search(pattern, line) for line in lines]
Что мы найдем?
>>> matches
[None,
None,
<re.Match object; span=(40, 61), match='Invalid user backups '>,
<re.Match object; span=(64, 85), match='invalid user backups '>]
Давайте пройдемся по хорошим совпадениям и напечатаем совпадение для подшаблона:
>>> for match in filter(None, matches):
... print(match.group(1))
...
backups
backups
Собираем все вместе, ономожет выглядеть так:
import re
pattern = r'[Ii]nvalid user\s+(\w+)\s+'
with open ('auth.log', 'rt') as myfile:
matches = [re.search(pattern, line) for line in myfile]
for match in sorted(filter(None, matches)):
print(match.group(1))