Мне нужно найти все экземпляры фразы в файле, а затем распечатать отсортированный список следующего слова после этой фразы - PullRequest
1 голос
/ 10 ноября 2019

Я пытаюсь запустить программу, в которой все время появляется фраза «Недопустимый пользователь», а затем программа находит имя пользователя для каждой недопустимой записи пользователя и распечатывает список пользователей в отсортированном виде. манера в алфавитном порядке. К сожалению, каждый раз, когда я запускаю программу, она печатает всю строку, а не только имена пользователей. Это пример файла, который я хочу найти:

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]

В третьей строке вы можете увидеть «Недопустимый пользователь», а затем «резервные копии», то есть имя пользователя, которого я хочунапечатали в конце. Вот код, с которым я работал, но он печатает «Неверный пользователь:», а затем всю строку после этого:

invalid_users = []
substr = "invalid user".lower()
with open('auth.log', 'rt') as myfile:
    for line in myfile:
        if line.lower().find(substr) != +1:
            invalid_users.append("Invalid user" + ": "+ line.lstrip("/n")) 

for users in invalid_users:
    print(users)

Хотелось бы, чтобы я был хорош в Python, но я очень неопытенс этим, и еще не повезло, изучая это еще. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 10 ноября 2019

Такую проблему - сопоставление с образцом в тексте - можно решить с помощью регулярных выражений (реализовано в модуле 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...