使用正则表达式解析日志文件

时间:2011-09-09 19:03:59

标签: regex

我正在尝试使用正则表达式来分割日期&其余的日志文件 - 我认为非常简单(非常好,因为我没有很少的正则表达式)

第一行......

17      00000002  2011-05-02 22:39:14  StringID "Custom_Task IDS_ENUM_Task_262144_0" not found for locale []    

可以正常使用

.*00000002  (.*)  (.*)

(日期周围有两个空格) 这个组“2011-05-02 22:39:14”和“StringID”Custom_Task IDS_ENUM_Task_262144_0“找不到locale []”

但我遇到了类似以下行的问题;

17      00000002  2011-04-05 10:46:53  Warning: Server component Requirement.SSC failed to load.  Please ensure that the server is properly licensed.
  • Please之前的另外两个空格导致它将组1设为“2011-04-05 10:46:53警告:服务器组件Requirement.SSC无法加载。”

显然,如果我尝试将其解析为失败的日期。

有什么建议吗?正如我所提到的,我真的不熟悉正则表达式,它可能正在盯着我: - )

我需要的是作为组1的日期时间和作为组2的行的其余部分

是的,我知道我可以从特定字符中删除该行,但这有两个原因

  1. 正在阅读的文件是巨大的&正则表达式比 left(substring(right(length-43 etc,etc: - )
  2. 日期的长度可以通过区域设置来确定 用户已实现 - 但我知道'总会有两个 日期部分之前和之后的空格。

3 个答案:

答案 0 :(得分:2)

你的问题是splat运算符是“贪婪的”,即它匹配尽可能多的字符。你想让它“非贪婪”,所以它匹配的字符很少。您可以在?之后添加*,例如

00000002  (.*?)  (.*)

我也冒昧地删除了前导.*,因为正则表达式默认为未锚定。

另一种解决方案是尝试匹配日期的格式而不是使用(.*?),因此您不再依赖双空格作为分隔符。假设您的所有日期都显示为YYYY-MM-DD HH:MM:SS,您可以使用以下内容执行此操作:

(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d)\s+(.*)

答案 1 :(得分:0)

这样的事情:

\d+\s+\d+\s+([0-9-]+)

00000002\s+([0-9-]+)

rubular

中查看此操作

答案 2 :(得分:0)

所以,如果我做对了,你想要日期和之后的内容吗?

你使用正则表达式的工具是什么?桑达? Perl的?

前两个字段总是相似吗?现在前两个字段之间似乎有更多空格?

17 00000002 2011-04-05 10:46:53 Warning: Server component Requirement.SSC failed to load. Please ensure that the server is properly licensed.

使用perl,您可以执行cat myfile | perl -pe 's/^(?:\S+\s+){2}(\S+\s\S+)\s+(.*)/$1 ## $2/'

其中:

(?:\S+\s+){2}表示我想要2次\ S + \ s +,这是非空格字符后跟空格字符(?:表示不捕获)

(\S+\s\S+)与您的日期匹配:非空格字符后跟一个空格,后跟更多非空格字符

\s+一些空格

(.*)其余的

它总会有效,但根据您的数据真实情况,我们可以做得更好......