Puncte:1

selectarea mai multor porțiuni a unui șir în python

drapel us

Am un fișier jurnal ca mai jos:

12-02-2022 15:18:22 +0330 SOCK5.6699 00000 user144 97.251.107.125:38605 1.1.1.1:443 51766 169369 0 CONNECT 1:44.1.
12-02-2022 15:18:27 +0330 SOCK5.6699 00094 user156 32.99.193.2:51242 1.1.1.1:443 715 388 0 CONNECT 1.1.1.1:443
12-02-2022 15:18:56 +0330 SOCK5.6699 00000 user105 191.184.66.98:40048 1.1.1.1:443 18105 29029 0 CONNECT 1.1:43.
12-02-2022 15:18:56 +0330 SOCK5.6699 00000 user105 191.184.66.98:40070 1.1.1.1:443 674 26805 0 CONNECT 1.1.4.3.
12-02-2022 15:20:24 +0330 SOCK5.6699 00000 user143 112.199.63.119:60682 1.1.1.1:443 475 445 0 CONNECT 1.1.31:44.31.
12-02-2022 15:20:37 +0330 SOCK5.6699 00000 user105 191.184.66.98:40102 1.1.1.1:443 12913 18780 0 CONNECT 1.141.1:441.
12-02-2022 15:20:42 +0330 SOCK5.6699 00000 user143 112.199.63.119:60688 1.1.1.1:443 4530 34717 0 CONNECT 1.141.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 CONNECT 1.1.1.1:443.1.1

Scopul meu este să extrag două porțiuni din acest fișier jurnal:

  1. Nume de utilizator
  2. Adresa IP a sursei utilizatorului

mai jos este un eșantion al porțiunilor de date necesare.

12-02-2022 15:18:22 +0330 SOCK5.6699 00000 utilizator144 97.251.107.125:38605 1.1.1.1:443 51766 169369 0 CONECTARE 1.1.1.1:443

Așa că am scris un script Python pentru a extrage ambele elemente și a le stoca în liste separate și apoi le-am alăturat cu funcția zip.

import pprint
importa colecții

iplist=[]
pentru l în date:
    ip_port=l[53:71]
    iplist.append(ip_port.split(':')[0])


lista de utilizatori=[]
pentru tine in date:
    utilizator=u[42:52]
    userlist.append(user.replace(" ", ""))

a=listă(zip(iplist,listă utilizatori))
most_ip=colecții.Counter(a).most_common(5)
pprint.pprint(cel mai_ip)

Acest cod funcționează bine și reușesc să obțin IP-ul cel mai utilizat cu numele de utilizator corespunzător. Trebuie sa mentionez si ca nu am folosit re modul, deoarece lista al doilea IP (IP-ul de destinație care este 1.1.1.1- de care nu-mi pasă)

Întrebare: Există vreo altă modalitate (mai ordonată) decât modul în care am scris codul?

dirkt avatar
drapel in
Ai fi putut folosi `cut` (instrument de linie de comandă).
Zareh Kasparian avatar
drapel us
@dirkt aceasta este o comandă bazată pe Linux/unix, încerc să folosesc Python. deoarece vreau să folosesc scriptul și pentru unele sisteme care nu sunt Unix.
drapel cn
Aceasta este probabil o potrivire mai bună pentru StackOverflow, deoarece este vorba despre programare. Nu sunt sigur dacă este un răspuns la problema dvs. reală, dar există o mulțime de instrumente pentru a analiza jurnalele, cum ar fi utilitarul Elastic FileBeats, printre multe altele. Ai putea să te uiți și la PyGrok.
drapel cn
De asemenea, faceți 2 iterații prin date, ceea ce este lent. Faceți una, împărțiți fiecare rând pe spații, scoateți câmpurile de care aveți nevoie prin index și adăugați-le în dicționar. O vei face în jumătate din timp.
Zareh Kasparian avatar
drapel us
@shearn89 Mulțumesc shearn89, ai menționat un punct bun. Mi-am editat codul, acum pare mai simplu și mult mai clar.
Puncte:1
drapel pm

Există multe capacități pentru a optimiza și noul cod. Cele două lucruri care mă prind cel mai mult:

Nu executați split() de mai multe ori pentru fiecare linie a jurnalului, doar executați split() o dată și stocați rezultatul într-o variabilă, deoarece fiecare execuție a acestei funcții are nevoie de ceva timp (chiar nu este mult, dar va adăuga mai multe date pe care le procesați).

s = i.split(' ')
ip=s[6].split(':')[0]
utilizator=s[5]

De ce să creați două liste și apoi să le comprimați împreună? Doar stocați tuplurile direct într-o listă:

l = []
pentru eu in date:
   s = i.split(' ')
   ip=s[6].split(':')[0]
   utilizator=s[5]
   l.append(tuplu((ip, utilizator)))
top_used=colecții.Counter(l).most_common(5)
Zareh Kasparian avatar
drapel us
Mulțumesc pentru codul tău. a avea tuple în acest caz este doar pentru a accelera codul?
Misc08 avatar
drapel pm
@ZarehKasparian Într-adevăr, crearea directă a tuplurilor accelerează codul, deoarece nu mai aveți nevoie de funcția zip, care practic este crearea de tupluri din acele două liste, consultați https://docs.python.org/3/library/ functions.html#zip
Puncte:1
drapel us

Cu sugestia „shearn89” mi-am editat codul după cum urmează:

mult mai simplu cu o singură iterație.

lista de utilizatori=[]
iplist=[]
pentru eu in date:
    ip=i.split(' ')[6].split(':')[0]
    user=i.split(' ')[5]
    iplist.append(ip)
    userlist.append(utilizator)

top_used=collections.Counter(zip(iplist,userlist)).most_common(5)
pprint.pprint(top_used)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.