使用正则表达式将自定义日志文件解析为字典

问题描述 投票:1回答:2

样本日志文件

Jun 15 02:04:59 combo sshd(pam_unix)[20897]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=220-135-151-1.hinet-ip.hinet.net  user=root\n'
Jun 15 02:04:59 combo sshd(pam_unix)[20898]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=220-135-151-1.hinet-ip.hinet.net  user=root\n'
Jun 15 04:06:18 combo su(pam_unix)[21416]: session opened for user cyrus by (uid=0)\n'
Jun 15 04:06:19 combo su(pam_unix)[21416]: session closed for user cyrus\n'
Jun 15 04:06:20 combo logrotate: ALERT exited abnormally with [1]\n'
Jun 15 04:12:42 combo su(pam_unix)[22644]: session opened for user news by (uid=0)\n'
Jun 15 04:12:43 combo su(pam_unix)[22644]: session closed for user news\n'

我想将数据分为日期,时间,PID和消息四列。

示例输出为

Dict = {"Date": "Jun 15", "Time": "02:04:59", "PID": "20897", "Message": "authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=220-135-151-1.hinet-ip.hinet.net  user=root\n'"}

之后,我打算将这些信息根据列保存到CSV文件中

我尝试查看其他示例,例如:

Parse a custom log file in python

How to parse this custom log file in Python

但是我不知道如何创建捕获组来帮助我实现这一目标。

我当前使用的正则表达式是>>

“(\ w {3} \ d {2})”作为日期

“(\ d {2}:\ d {2}:\ d {2})” for time

“(?<= [)。+?(?=] :)” for PID

“((?? ==)。*)”表示消息

但是当我将它们组合在一起时什么也没发生

示例日志文件Jun 15 02:04:59 combo sshd(pam_unix)[20897]:身份验证失败; logname = uid = 0 euid = 0 tty = NODEVssh ruser = rhost = 220-135-151-1.hinet-ip.hinet.net user = root \ n'Jun 15 02:04:59 ...

python python-3.x regex regex-group
2个回答
0
投票

您是什么意思将它们组合在一起?您是否尝试过在for循环中执行此操作?我大概就是那样去做的。听起来您正在尝试捕获所有组并将它们传递给re.findall(我在猜测)。但是findall用于捕获单个捕获组的多个实例。因此,将您的正则表达式放在列表中,使用re.findcaptures方法迭代并匹配每个正则表达式。您使用的正则表达式是正确的(尽管对于日期,我会捕获每行的前两个单词)。


0
投票

一种解决方案是遍历每一行。对于每一行,使用特定的正则表达式选择DateTimePIDMessage

© www.soinside.com 2019 - 2024. All rights reserved.