【问题标题】:Multi-line parsing多行解析
【发布时间】:2015-08-20 09:28:15
【问题描述】:

我正在解析一个日志文件:

2015-07-15 12:59:39 +0530 [ERROR] index=abc host=abc
2015-07-15 12:59:39 +0530 [WARNING] index=def
host=def
2015-07-15 12:59:39 +0530 [INFO] index=ghi host=ghi

每个日志都以时间戳开头。

我正在考虑单独解析日志。我想通过时间戳将它们分开并获取,所以我写了一个正则表达式:

text = File.open('logs.txt').read
log = text[/^\d{4}\-\d{2}\-\d{2}(.*?)^\d{4}\-\d{2}\-\d{2}/m, ].to_s
.gsub(/\s/m,' ').strip.split(' ')
puts log #Prints 2015-07-15 12:59:39 +0530 [ERROR] index=abc host=abc

但是,这只会获取第一个日志:

2015-07-15 12:59:39 +0530 [ERROR] index=abc host=abc 

而不是其余的。

  1. 如何在第一个日志之后继续获取日志?
  2. 有没有比我的方法更好的方法来处理这个问题?

谢谢。

【问题讨论】:

    标签: ruby regex parsing fileparsing


    【解决方案1】:
    1. 使用scan 而不是[]
    2. 逐行读取,而不是一次读取整个日志文件。

    【讨论】:

    • 3. /^\d{4}\-\d{2}\-\d{2}(.*?)^\d{4}\-\d{2}\-\d{2}/m 太贪心了。应该是积极的前瞻性,或者只是/^\d{4}\-\d{2}\-\d{2}(.*?)$
    【解决方案2】:

    您的格式是否正确,并且日志可以跨越多行?如果它们用换行符分隔,您可以使用

    log = text.lines
    

    【讨论】:

    • 您好 Borsunho,您是对的,这些是多行日志。但是,当您 tru text.lines 时,它将给出所有行。我正在寻找两个时间戳之间的内容。
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多