AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1093488
Accepted
Zareh Kasparian
Zareh Kasparian
Asked: 2022-02-13 11:40:35 +0800 CST2022-02-13 11:40:35 +0800 CST 2022-02-13 11:40:35 +0800 CST

python中字符串的多部分选择

  • 772

我有一个日志文件如下:

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

我的目标是提取此日志文件的两个部分:

  1. 用户名
  2. 用户源IP地址

以下是所需数​​据部分的示例。

2022 年 2 月 2 日 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 函数将它们连接起来。

import pprint
import collections

iplist=[]
for l in data:
    ip_port=l[53:71]
    iplist.append(ip_port.split(':')[0])


userlist=[]
for u in data:
    user=u[42:52]
    userlist.append(user.replace(" ", ""))

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

这段代码工作正常,我可以使用相应的用户名获取最常用的 ip。还需要提到我没有使用re模块,因为它列出了第二个 IP(目标 IP 是 1.1.1.1-我不关心它)

问题: 除了我编写代码的方式之外,还有其他方式(更简洁)吗?

python
  • 2 2 个回答
  • 32 Views

2 个回答

  • Voted
  1. Zareh Kasparian
    2022-02-15T09:52:44+08:002022-02-15T09:52:44+08:00

    在“shearn89”的建议下,我编辑了我的代码如下:

    一次迭代就简单多了。

    userlist=[]
    iplist=[]
    for i in data:
        ip=i.split(' ')[6].split(':')[0]
        user=i.split(' ')[5]
        iplist.append(ip)
        userlist.append(user)
    
    top_used=collections.Counter(zip(iplist,userlist)).most_common(5)
    pprint.pprint(top_used)
    
    • 1
  2. Best Answer
    Misc08
    2022-02-18T15:36:29+08:002022-02-18T15:36:29+08:00

    还有许多功能可以优化您的新代码。最吸引我的两件事:

    不要对日志的每一行多次执行split(),只执行一次split()并将结果存储在一个变量中,因为这个函数的每次执行都需要一些时间(即使它不多,但会加起来)您处理的更多数据)。

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

    为什么要创建两个列表然后将它们压缩在一起?只需将元组直接存储在列表中:

    l = []
    for i in data:
       s = i.split(' ')
       ip=s[6].split(':')[0]
       user=s[5]
       l.append(tuple((ip, user)))
    top_used=collections.Counter(l).most_common(5)
    
    • 1

相关问题

  • 在 cygwin/XP 下安装完整 Python 的最佳方式?

  • Mac OS X:从 python 脚本中更改 $PATH

  • 可以使用 easy_install 和 bdist_rpm 安装吗?

  • 我可以“注册”python 脚本以在 Windows 上执行吗?

  • 如何使用脚本远程重启 Windows 服务?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve