Điểm:1

lựa chọn nhiều phần của một chuỗi trong python

lá cờ us

Tôi có một tệp nhật ký như sau:

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.1.1.1:443
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.1.1:443
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.1.1:443
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.1.1:443
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.1.1.1:443
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.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 CONNECT 1.1.1.1:443

mục tiêu của tôi là trích xuất hai phần của tệp nhật ký này:

  1. tên tài khoản
  2. Địa chỉ IP của nguồn người dùng

dưới đây là một mẫu của các phần dữ liệu cần thiết.

12-02-2022 15:18:22 +0330 SOCK5.6699 00000 người dùng144 97.251.107.125:38605 1.1.1.1:443 51766 169369 0 KẾT NỐI 1.1.1.1:443

Vì vậy, tôi đã viết một tập lệnh Python để trích xuất cả hai mục và lưu trữ chúng trong các danh sách riêng biệt, sau đó nối chúng với chức năng zip.

nhập pprint
bộ sưu tập nhập khẩu

iplist=[]
cho l trong dữ liệu:
    ip_port=l[53:71]
    iplist.append(ip_port.split(':')[0])


danh sách người dùng = []
cho bạn trong dữ liệu:
    người dùng=u[42:52]
    userlist.append(user.replace(" ", ""))

a=list(zip(iplist,userlist))
most_ip=collections.Counter(a).most_common(5)
pprint.pprint(most_ip)

Mã này hoạt động tốt và tôi có thể lấy ip được sử dụng nhiều nhất với tên người dùng tương ứng. Cũng cần đề cập rằng tôi đã không sử dụng lại mô-đun, vì nó đang liệt kê IP thứ hai (IP đích là 1.1.1.1- mà tôi không quan tâm đến nó)

Câu hỏi: Có cách nào khác (gọn gàng hơn) so với cách tôi đã viết mã không?

dirkt avatar
lá cờ in
Bạn có thể đã sử dụng `cut` (công cụ dòng lệnh).
Zareh Kasparian avatar
lá cờ us
@dirkt đây là lệnh dựa trên Linux/unix, tôi đang cố gắng sử dụng Python. vì tôi cũng muốn sử dụng tập lệnh cho một số hệ thống không phải Unix.
lá cờ cn
Điều này có lẽ phù hợp hơn với StackOverflow vì đó là về lập trình. Không chắc đó có phải là câu trả lời cho vấn đề thực tế của bạn hay không nhưng có rất nhiều công cụ để phân tích nhật ký, chẳng hạn như tiện ích Elastic FileBeats, trong số nhiều công cụ khác. Bạn cũng có thể xem PyGrok.
lá cờ cn
Ngoài ra, bạn đang thực hiện 2 lần lặp thông qua dữ liệu chậm. Làm một cái, tách từng dòng trên khoảng trắng, kéo ra các trường bạn cần theo chỉ mục và thêm chúng vào từ điển. Bạn sẽ làm điều đó trong một nửa thời gian.
Zareh Kasparian avatar
lá cờ us
@ shearn89 Cảm ơn shearn89, bạn đã đề cập đến một điểm hay. Tôi đã chỉnh sửa mã của mình, bây giờ nó trông đơn giản và rõ ràng hơn nhiều.
Điểm:1
lá cờ us

Với gợi ý "shearn89", tôi đã chỉnh sửa mã của mình như sau:

đơn giản hơn nhiều với một lần lặp duy nhất.

danh sách người dùng = []
iplist=[]
cho tôi trong dữ liệu:
    ip=i.split(' ')[6].split(':')[0]
    người dùng=i.split(' ')[5]
    iplist.append(ip)
    userlist.append(người dùng)

top_used=collections.Counter(zip(iplist,userlist)).most_common(5)
pprint.pprint(top_used)
Điểm:1
lá cờ pm

Có nhiều khả năng để tối ưu hóa mã mới của bạn. Hai điều thu hút tôi nhất:

Không thực hiện split() nhiều lần cho mỗi dòng của nhật ký, chỉ thực hiện split() một lần và lưu kết quả vào một biến, bởi vì mỗi lần thực hiện hàm này cần một khoảng thời gian (thậm chí không nhiều, nhưng sẽ cộng bạn xử lý nhiều dữ liệu hơn).

s = i.split(' ')
ip=s[6].split(':')[0]
người dùng=s[5]

Tại sao phải tạo hai danh sách và sau đó nén chúng lại với nhau? Chỉ cần lưu trữ các bộ dữ liệu trực tiếp trong danh sách:

tôi = []
cho tôi trong dữ liệu:
   s = i.split(' ')
   ip=s[6].split(':')[0]
   người dùng=s[5]
   l.append(tuple((ip, user)))
top_used=collections.Counter(l).most_common(5)
Zareh Kasparian avatar
lá cờ us
Cảm ơn mã của bạn. có bộ dữ liệu trong trường hợp này chỉ để tăng tốc mã?
Misc08 avatar
lá cờ pm
@ZarehKasparian Thật vậy, việc tạo các bộ dữ liệu trực tiếp đang tăng tốc mã, vì bạn không cần hàm zip nữa, về cơ bản là tạo các bộ dữ liệu từ hai danh sách đó, xem https://docs.python.org/3/library/ hàm.html#zip

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.