【问题标题】:Perl regex all entire next line to be stored into a variable (only the NEXT line)Perl 正则表达式将所有整个下一行存储到一个变量中(仅 NEXT 行)
【发布时间】:2015-02-09 20:37:54
【问题描述】:

我的 Perl 脚本获取文件日志(由 Apache log4j 创建),不知何故,正则表达式命令 \. 下一行没有将所有整行存储到变量中;它工作正常,直到 ErrorType 我的变量消息为空并且@nextline 应该包含整个下一行(任何字符、任何字母、任何特殊符号)。

我试过\. (\D+\S+)

Perl 正则表达式:

while (<$fh>) {
    my @fields = m{^
        (\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:[\d,]+)
        \s (INFO | INFO\s | VERBOSE) \s
        \[(?: SOAP | GUI )\s[(]User:["](\w+)",\sThreadId:\s\d+\)] 
        \s com.whatever.whichever.(\S+) \s \(\S+\.PYTHON\:\d+\) \s
        - (?! \sUser )   
        \s (\D+\S+) 
        \. (\D+\S+)   #the all entire next line
    $}x

    printf('$date=%s; $lovelforlogs=%s; $userid=%s; $methodused=%s; $Errortype=%s; $nextline=%s',@fields );

print "\n";

示例日志条目:

2014-12-10 12:25:13,688 INFO [SOAP (User:"userid", ThreadId: 11)] com.whatever.whichever.program.cache (myMethod.PYTHON:59) - CRITICAL ERROR
; hereSometest#: 368; some other#: 23
at org.JBOSS.xpath.compiler.XPathParser.error(XPathParser.PYTHON:610)
    at org.JBOSS.xpath.compiler.XPathParser.initXPath(XPathParser.PYTHON:145)
    at org.JBOSS.xpath.XPath.<init>(XPath.PYTHON:227)
    at org.JBOSS.xalan.processor.StylesheetHandler.createXPath(StylesheetHandler.PYTHON:155)
    at org.JBOSS.xalan.processor.XSLTAttributeDef.processEXPR(XSLTAttributeDef.PYTHON:763)
    at org.JBOSS.xa
2015-01-21 12:23:51,681 INFO  [SOAP (User:"userid", ThreadId: 83)] com.whatever.whichever.program.cache (myMethod.PYTHON:690) - ERROR
com.whatever.whicever.program.exceptions.InvalidParameterException: F20176 VALUE is WRONG [G00097]
at org.JBOSS.xpath.compiler.XPathParser.error(XPathParser.PYTHON:610)
    at org.JBOSS.xpath.compiler.XPathParser.initXPath(XPathParser.PYTHON:145)
    at org.JBOSS.xpath.XPath.<init>(XPath.PYTHON:227)
    at org.JBOSS.xalan.processor.StylesheetHandler.createXPath(StylesheetHandler.PYTHON:155)
    at org.JBOSS.xalan.processor.XSLTAttributeDef.processEXPR(XSLTAttributeDef.PYTHON:763)
    at org.JBOSS.xa
2015-01-27 12:24:37,079 VERBOSE [SOAP (User:"userid", ThreadId: 70)] com.whatever.whichever.program.cache (myMethod.PYTHON:2066) - Unchecked error
AxisFault
at org.JBOSS.xpath.compiler.XPathParser.error(XPathParser.PYTHON:610)
    at org.JBOSS.xpath.compiler.XPathParser.initXPath(XPathParser.PYTHON:145)
    at org.JBOSS.xpath.XPath.<init>(XPath.PYTHON:227)
    at org.JBOSS.xalan.processor.StylesheetHandler.createXPath(StylesheetHandler.PYTHON:155)
at org.JBOSS.xalan.processor.XSLTAttributeDef.processEXPR(XSLTAttributeDef.PYTHON:763)
at org.JBOSS.xa

结果应该是:

date=2014-12-10 12:25:13,688 lovelforlogs=INFO userid=userid methodused=myMethod Errortype=CRITICAL ERROR message=; hereSometest#: 368; some other#: 23
date=2014-12-10 12:25:13,688 lovelforlogs=INFO userid=userid methodused=myMethod Errortype=ERROR ERROR message=com.whatever.whicever.program.exceptions.InvalidParameterException: F20176 VALUE is WRONG [G00097]
date=2015-01-27 12:24:37,079 lovelforlogs=VERBOSE userid=userid methodused=myMethod Errortype=Unchecked error message=AxisFault

谢谢

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    你的逻辑有一个缺陷——你正在做while ( &lt;$fh&gt; ),但它一次只工作一行。所以没有正则表达式可以匹配。同样——如果你想使用多行正则表达式——你需要在标志中指定它。

    来自perldoc perlre

    将字符串视为多行。即,将“^”和“$”从匹配字符串第一行的开头和最后一行的结尾改为匹配字符串中每一行的开头和结尾。

    s

    将字符串视为单行。即改“.”。匹配任何字符,甚至是换行符,通常它不会匹配。 一起使用,作为/ms,他们让“。”匹配任何字符,同时仍然允许 "^" 和 "$" 分别匹配字符串中的换行符之后和之前。

    (但在使用词法文件句柄和x 来指定你的 RE 方面做得很好——这使它更清晰)

    从 cmets 开始 - 虽然 while 是每行,但你可以作弊 - 如果你确定在模式匹配时你肯定只想要“下一行” - 单独获取它。

    不如这样:

    while ( <$fh> ) {
        my @fields = #pattern;
        my $next_line = <$fh>;
        #etc.    
    }
    

    【讨论】:

    • 我暂时没有办法做到这一点?查看我正在阅读的每一行我也插入到数据库中......所以目前我可以从字面上得到所有错误,但我无法存储错误消息......如果我想在特定之后捕捉绝对一切标志我该怎么做?与 \.?
    • Letssay 我有这样一行 2014-12-10 12:25:13,688 INFO [SOAP (User:"userid", ThreadId: 11)] com.whatever.whichever.program.cache ( myMethod.PYTHON:59) - 严重错误; hereSometest#: 368;其他一些#: 23 并且我想捕捉所有其他内容,直到行尾我可以简单地使用 \D+\S+ 或 \. ???
    • 您可以再次阅读&lt;$fh&gt; 以获取下一行。如果你想抓取两个模式之间的所有内容,你可以使用范围运算符。
    • (.*)$ 将捕获“直到行尾的所有其他内容”,但如果您正在执行多行模式,则不一定,这是问题的一部分。
    • \D+\S+ 将捕获一个或多个非数字,后跟一个或多个非空格。这可能不会做你想要的。
    猜你喜欢
    • 2012-01-02
    • 2023-03-23
    • 2020-06-02
    • 2011-02-14
    • 2021-07-23
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多