Рейтинг:1

выбор нескольких частей строки в python

флаг us

У меня есть файл журнала, как показано ниже:

02-12-2022 15:18:22 +0330 SOCK5.6699 00000 user144 97.251.107.125:38605 1.1.1.1:443 51766 169369 0 ПОДКЛЮЧИТЬ 1.1.1.1:443
02-12-2022 15:18:27 +0330 SOCK5.6699 00094 user156 32.99.193.2:51242 1.1.1.1:443 715 388 0 ПОДКЛЮЧИТЬ 1.1.1.1:443
02-12-2022 15:18:56 +0330 SOCK5.6699 00000 user105 191.184.66.98:40048 1.1.1.1:443 18105 29029 0 ПОДКЛЮЧИТЬ 1.1.1.1:443
02-12-2022 15:18:56 +0330 SOCK5.6699 00000 user105 191.184.66.98:40070 1.1.1.1:443 674 26805 0 ПОДКЛЮЧИТЬ 1.1.1.1:443
02-12-2022 15:20:24 +0330 SOCK5.6699 00000 user143 112.199.63.119:60682 1.1.1.1:443 475 445 0 ПОДКЛЮЧИТЬ 1.1.1.1:443
02-12-2022 15:20:37 +0330 SOCK5.6699 00000 user105 191.184.66.98:40102 1.1.1.1:443 12913 18780 0 ПОДКЛЮЧИТЬ 1.1.1.1:443
02-12-2022 15:20:42 +0330 SOCK5.6699 00000 user143 112.199.63.119:60688 1.1.1.1:443 4530 34717 0 ПОДКЛЮЧИТЬ 1.1.1.1:443
12-02-2022 15:20:44 +0330 SOCK5.6699 00000 user127 212.167.145.49:2972 1.1.1.1:443 827 267 0 ПОДКЛЮЧИТЬ 1.1.1.1:443

моя цель - извлечь две части этого файла журнала:

  1. Имя пользователя
  2. IP-адрес источника пользователя

ниже приведен образец необходимых данных.

02-12-2022 15:18:22 +0330 SOCK5.6699 00000 пользователь 144 97.251.107.125:38605 1.1.1.1:443 51766 169369 0 ПОДКЛЮЧИТЬ 1.1.1.1:443

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

импорт pprint
импорт коллекций

IP-список=[]
для l в данных:
    ip_port=l[53:71]
    iplist.append(ip_port.split(':')[0])


список пользователей=[]
для вас в данных:
    пользователь=у[42:52]
    userlist.append(user.replace(" ", ""))

a = список (zip (iplist, список пользователей))
most_ip=коллекции.Счетчик(a).most_common(5)
pprint.pprint(самый_ip)

Этот код отлично работает, и я могу получить наиболее часто используемый IP-адрес с соответствующим именем пользователя. Также нужно упомянуть, что я не использовал ре модуль, поскольку он указывал второй IP-адрес (целевой IP-адрес 1.1.1.1, который меня не волнует)

Вопрос: Есть ли другой способ (более аккуратный), чем тот, которым я написал код?

dirkt avatar
флаг in
Вы могли бы использовать `cut` (инструмент командной строки).
Zareh Kasparian avatar
флаг us
@dirkt это команда на основе Linux/unix, я пытаюсь использовать Python. так как я хочу использовать скрипт и для некоторых систем, отличных от Unix.
флаг cn
Это, вероятно, лучше подходит для StackOverflow, поскольку речь идет о программировании. Не уверен, что это ответ на вашу настоящую проблему, но существует множество инструментов для анализа журналов, таких как утилита Elastic FileBeats и многие другие. Вы также можете посмотреть на PyGrok.
флаг cn
Кроме того, вы делаете 2 итерации по данным, которые медленны. Сделайте один, разбейте каждую строку на пробелы, вытащите нужные вам поля по индексу и добавьте их в словарь. Вы сделаете это за половину времени.
Zareh Kasparian avatar
флаг us
@ shearn89 Спасибо, shearn89, вы упомянули хороший момент. Я отредактировал свой код, теперь он выглядит проще и понятнее.
Рейтинг:1
флаг pm

Существует множество возможностей для оптимизации вашего нового кода. Две вещи, которые меня больше всего зацепили:

Не выполняйте split() более одного раза для каждой строки лога, просто выполните split() один раз и сохраните результат в переменной, т.к. каждое выполнение этой функции требует некоторого времени (пусть и немного, но суммирует больше данных, которые вы обрабатываете).

s = i.split(' ')
ip=s[6].split(':')[0]
пользователь=с[5]

Зачем создавать два списка, а затем объединять их вместе? Просто сохраните кортежи непосредственно в списке:

л = []
для я в данных:
   s = i.split(' ')
   ip=s[6].split(':')[0]
   пользователь=с[5]
   l.append(кортеж((ip, пользователь)))
top_used=коллекции.Counter(l).most_common(5)
Zareh Kasparian avatar
флаг us
Спасибо за ваш код. наличие кортежа в этом случае просто для ускорения кода?
Misc08 avatar
флаг pm
@ZarehKasparian Действительно, создание кортежей напрямую ускоряет код, поскольку вам больше не нужна zip-функция, которая в основном создает кортежи из этих двух списков, см. https://docs.python.org/3/library/ functions.html#zip
Рейтинг:1
флаг us

С предложением «shern89» я отредактировал свой код, как показано ниже:

намного проще с одной итерацией.

список пользователей=[]
IP-список=[]
для я в данных:
    ip=i.split(' ')[6].split(':')[0]
    пользователь = i.split (' ') [5]
    iplist.append(ip)
    userlist.append(пользователь)

top_used=коллекции.Counter(zip(iplist,userlist)).most_common(5)
pprint.pprint (top_used)

Ответить или комментировать

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