样本日志文件
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 ...
您是什么意思将它们组合在一起?您是否尝试过在for循环中执行此操作?我大概就是那样去做的。听起来您正在尝试捕获所有组并将它们传递给re.findall
(我在猜测)。但是findall用于捕获单个捕获组的多个实例。因此,将您的正则表达式放在列表中,使用re.find
或captures
方法迭代并匹配每个正则表达式。您使用的正则表达式是正确的(尽管对于日期,我会捕获每行的前两个单词)。
一种解决方案是遍历每一行。对于每一行,使用特定的正则表达式选择Date
,Time
,PID
和Message
。