RegExp从Redmine日志中提取数据

2024-05-13 13:54:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个超过一百万行的日志文件。我正试图根据一个特定的用户名从日志中提取一些数据。你知道吗

日志样本:

Started POST "/projects/some-project/issues/update_form.js" for 194.176.105.12 at Tue Jun 10 14:58:59 +0200 2014
Processing by IssuesController#update_form as JS
  Parameters: {"issue"=>{"is_private"=>"0", "done_ratio"=>"0", "fixed_version_id"=>"", "tracker_id"=>"2", "assigned_to_id"=>"", "due_date"=>"", "custom_field_values"=>{"12"=>[""], "16"=>[""]}, "subject"=>"", "start_date"=>"", "estimated_hours"=>"", "description"=>"", "status_id"=>"1", "priority_id"=>"2"}, "project_id"=>"barnet-and-chase-farm", "attachments"=>{"screenshot"=>{"name"=>"screenshot", "content"=>"", "description"=>""}}, "utf8"=>"✓", "authenticity_token"=>"sometoken"}
  Current user: SOME.USERNAME (id=20)
  Rendered issues/_form_custom_fields.html.erb (3.7ms)
  Rendered issues/_attributes.html.erb (397.9ms)
  Rendered plugins/redmine_screenshot_paste/app/views/issues/_screenshot.html.erb (0.6ms)
  Rendered issues/_form.html.erb (418.6ms)
  Rendered issues/update_form.js.erb (422.3ms)
Completed 200 OK in 1032.4ms (Views: 406.6ms | ActiveRecord: 22.7ms)

日志文件中有许多上述的重复块。块中的内容是可变的-即可能有不同的数据、不同的行数等。但是,所有块都以字符串Started开始,以字符串Completed结束-两个字符串始终位于新行的第1列。你知道吗

我只需要提取那些包含字符串Current user: SOME.USERNAME的块

实现这一目标的最佳方法是什么?我猜RegExp可以做到这一点,但我不确定如何编写它来达到预期的效果。你知道吗

我可以使用linux命令行(grep等)或者一些软件,比如Sublime Text或者Notepad++或者社区推荐的任何东西,比如Python脚本。你知道吗


Tags: 文件数据字符串formprojectidhtmljs
1条回答
网友
1楼 · 发布于 2024-05-13 13:54:28

您可以使用以下正则表达式:

(?ms)^Started [^\n]*(?:(?!^Completed\b).)*?Current user: SOME\.USERNAME\b.*?^Completed\b[^\n]*

作为一个小python片段,您可以

import sys, re

user= sys.argv[2]
pattern= r'(?ms)^Started [^\n]*(?:(?!^Completed\b).)*?Current user: %s\b.*?^Completed\b[^\n]*'%re.escape(user)
with open(sys.argv[1]) as f:
    print '\n'.join(re.findall(pattern, f.read()))

并称之为

python my_script.py /path/to/log_file.txt SOME.USERNAME

相关问题 更多 >