使用正则表达式过滤日志文件

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

嗨,我似乎无法弄清楚如何从日志文件中提取日期和 PID。 我正在尝试显示日期,然后显示 pid,如下所示。但它不会显示 PID,只显示日期。

请查看我的代码:

def show_time_of_pid(line):

  pattern = r"^([\w+]*[\s\d\:]+.[\[(\d+)\]])"
  result = re.search(pattern, line)

  return result

print(show_time_of_pid("Jul 6 14:01:23 computer.name CRON[29440]: USER (good_user)")) # Jul 6 14:01:23 pid:29440
<re.Match object; span=(0, 14), match='Jul 6 14:01:23'>

我很期待

Jul 6 14:01:23 pid:29440

我明白了

<re.Match object; span=(0, 14), match='Jul 6 14:01:23'> **NO PID DISPLAYED

python regex pid logfile-analysis
1个回答
0
投票

我可能会写这样的东西:

def show_time_of_pid(line):

    pattern = r"^(\w{3}) \s (\d+) \s ([\d:]+) \s .[^[]+\[(\d+)]:.*"
    result = re.search(pattern, line, flags=re.VERBOSE)

    return result.groups()

print(show_time_of_pid("Jul 6 14:01:23 computer.name CRON[29440]: USER (good_user)"))

使用

re.VERBOSE
让我们可以将内容分开以便于阅读。这里我们有几个不同的比赛组:

  • (\w{3})
    与月份名称匹配
  • (\d+)
    匹配该月的日期
  • ([\d:]+)
    与时间相符
  • [^[]+\[(\d+)]
    与 PID 匹配(“一堆不是
    [
    的字符,后跟
    [
    ,然后是一串数字,然后是
    ]

每组之间用空格分隔 (

\s
)。

运行上面的代码会产生:

('Jul', '6', '14:01:23', '29440')

你可以更喜欢外部捕获组;通过写作:

import re

def show_time_of_pid(line):

    pattern = r"^((\w{3}) \s (\d+) \s ([\d:]+)) \s .[^[]+\[(\d+)]:.*"
    result = re.search(pattern, line, flags=re.VERBOSE)

    return result.groups()

print(show_time_of_pid("Jul 6 14:01:23 computer.name CRON[29440]: USER (good_user)"))

我们在第一个捕获组中获取整个日期字符串:

('Jul 6 14:01:23', 'Jul', '6', '14:01:23', '29440')

当然,我们可以通过使用命名捕获组取回带标签的字典,而不仅仅是列表:

import re

def show_time_of_pid(line):

    pattern = r"^(?P<timestamp>(?P<month>\w{3}) \s (?P<day>\d+) \s ([\d:]+)) \s .[^[]+\[(?P<pid>\d+)]:.*"
    result = re.search(pattern, line, flags=re.VERBOSE)

    return result.groupdict()

print(show_time_of_pid("Jul 6 14:01:23 computer.name CRON[29440]: USER (good_user)"))

产生:

{'timestamp': 'Jul 6 14:01:23', 'month': 'Jul', 'day': '6', 'pid': '29440'}
© www.soinside.com 2019 - 2024. All rights reserved.