如何使用jSoup从<pre> field and keep formatting</pre>抓取文本

时间:2015-01-29 14:56:21

标签: html awk jsoup

我正在尝试简化由ruby脚本创建的日志,该脚本生成一个简单的日志文件,其中包含时间戳消息和JSON的混合,类似于:

[TIMESTAMP] MESSAGE
[
    {
        "JSON STUFF HERE"
    }
]
[TIMESTAMP]

问题是如果将日志文件保存为.txt,它没有换行符,这使得几乎不可能正则输出。实际上,保留的唯一时间换行符是浏览器html版本,其中文本包含“pre”标记。我用gsub尝试过awk:

gsub( / \[/, /\r\n\[/)

但仍无法在文件中创建换行符。我想知道最简单的方法是加载它格式化,因为我需要自动化该过程。

2 个答案:

答案 0 :(得分:0)

这个问题有几个单独的问题,而且我说没有换行符(在JSON部分中)实际上使正则表达式进程更容易(绝对是sed ),但也许我在这里被误解了。

所以说,假设你有python可用,你可以使用它的json module至少为JSON做漂亮打印:

python -mjson.tool logfile.json

请参阅有关缩进和换行的选项的文档。

答案 1 :(得分:0)

也许这足以让你开始。

你可以用awk的另一种方式思考它。 Awk旨在处理&#34;记录&#34;。虽然典型的记录分隔符是换行符,但记录分隔符可以设置为任何有用的单个字符,标准awk或带有GNU awk的正则表达式。

因此,如果您的日志文件如下:

[TIMESTAMP] MESSAGE : Some message [ { "JSON STUFF HERE" } ] [TIMESTAMP] MESSAGE2 : Some other message [TIMESTAMP] ...

它有匹配的括号,但没有换行符,你可以试试像:

awk 'BEGIN {FS="\]|:"; RS="\["} NF==3 && !/\{/ {print $1, $2, $3}' data

,其中

  • 字段分隔符设置为FS]块中设置为:BEGIN
  • 记录分隔符RS[块中设置为BEGIN,而不是使用默认的换行符
  • 如果您的评论中有:之类的消息分隔符,那么NF==3对于打印TIMESTAMPSMESSAGES来说是一个简单但不是很好的测试作为字段$1$2。假设$3是记录的其余部分。
  • 由于有效JSON可以包含相同的字段分隔符,因此还可以测试&#39; {&#39;排除短JSON块。

示例数据作为单行导致:

TIMESTAMP  MESSAGE   Some message 
TIMESTAMP  MESSAGE2   Some other message

现在显然,模式测试很弱,考虑到MESSAGES之后的数据可能会有更多:]导致这些记录中的NF计数更高。在这种情况下,确保$1匹配特定时间戳格式将提供更好的记录捕获。