首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:如何遍历指定日期和时间之后的一组文件和grep for logs

Python:如何遍历指定日期和时间之后的一组文件和grep for logs
EN

Stack Overflow用户
提问于 2018-08-15 08:15:07
回答 1查看 50关注 0票数 1

我的任务是从10个文本文件中收集日志,这些文本文件是,a,a.0,a.1……a.9.这些日志需要从指定的日期和时间收集,该日期和时间作为参数传递。最大的问题是我知道如何在那之后找到日期和日志,但我如何同时对10个文本文件重复相同的操作。收集的日志将再次保存在文本文件中。

到目前为止,我已经尝试过了:

代码语言:javascript
复制
month_abbr = {"jan": 1, "feb": 2, "mar": 3, "apr": 4, "may": 5, "jun": 6,
              "jul": 7, "aug": 8, "sep": 9, "oct": 10, "nov": 11, "dec": 12}

min_val = "Aug 14 15:35:54"
print min_val


def parse_date(lines):
    mon, day, tim = lines.split(None, 3)[:-1]

    date_string = "{:02} {:02} ".format(month_abbr[mon.lower()], int(day)) + tim
    try:
        return datetime.strptime(date_string, "%m %d %H:%M:%S.%f")
    except ValueError as e:
        return datetime.strptime(date_string, "%m %d %H:%M:%S")


def threshold(min_val):
    mon, day, tim = min_val.split(None, 3)
    date_string = "{:02} {:02} ".format(month_abbr[mon.lower()], int(day)) + tim
    try:
        return datetime.strptime(date_string, "%m %d %H:%M:%S.%f")
    except ValueError as e:
        return datetime.strptime(date_string, "%m %d %H:%M:%S")


command = ' grep -i error /var/log/a | grep -i a0 '

sub_proc1 = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, preexec_fn=lambda: signal(SIGPIPE, SIG_DFL))

result = sub_proc1.communicate()[0]
timestamp = open("temp.txt", "w+")
timestamp.write(result)
timestamp.close()
f = open("temp.txt")

for lines in f:
    date_string = " ".join(lines.split(None, 3)[:-1])
    #print(date_string)
    date_object = parse_date(lines)
    #print(date_object)
    if parse_date(lines) >= threshold(min_val):
        print(lines)

请注意:只能使用标准Python库!

EN

回答 1

Stack Overflow用户

发布于 2018-08-15 09:23:17

所以,这是我的解决方案:

代码语言:javascript
复制
import sys
import os
from datetime import datetime

MONTHS = {month: i for i, month in enumerate(['jan', 'feb', 'mar', 'apr', 'may', 'jun',
                                              'jul', 'aug', 'sep', 'oct', 'nov',  'dec'])}
LOG_DIR = '/var/log'


def parse_date(s):
    try:
        month, rest = s.split(None, 1)
    except ValueError:
        return None

    date = MONTHS[month.lower()] + ' {rest}'

    try:
        return datetime.strptime(date, "%m %d %H:%M:%S.%f")
    except ValueError:
        pass

    try:
        return datetime.strptime(date, "%m %d %H:%M:%S")
    except ValueError:
        pass

    return None


if len(sys.argv) != 4:
    print('Usage: <start> <end>', file=sys.stderr)
    exit(1)

start, end = sys.argv[1:]

for filename in os.listdir(os.path.join(LOG_DIR)):
    name, *_ = filename.rsplit('.')
    date = parse_date(name)
    if date and parse_date(start) <= date <= parse_date(end):
        with open(os.path.join(LOG_DIR, filename)) as f, open(output, 'a') as out:
            for line in f:
                print(line)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51851301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档