使用Groovy脚本从日志文件复制特定的XML块

时间:2018-07-30 13:25:08

标签: regex groovy

我正在尝试通过Groovy从大日志文件中提取特定块。我有一个大的日志文件,其中包含类似于以下内容的XML块:

<Block start tag>
....
...
<ID>1</ID>
...
...
<Block end tag>

.....

<Block start tag>
....
...
<ID>2</ID>
...
...
<Block end tag>

....

<Block start tag>
....
...
<ID>2</ID>
...
...
<Block end tag>

以此类推

我只想提取包含值2的块。目前,我正在尝试:

String starttag="Block start tag"
String endtag="Block end tag"
//log.info string

def extract= (fileContents =~  /(?s)<${starttag}.*<ID>2</ID>.*${endtag}>/) 

但是系统将从第一个包含值1的块一直复制到最后一个文本。

如何配置正则表达式以专门从日志文件中所有包含特定标记中的特定值的块中搜索?

1 个答案:

答案 0 :(得分:0)

我创建一个示例xml:

<root>
    <Block12311qwwqw>
        <def>4</def>
        <ID>1</ID>
    </Block12311qwwqw>
    <Blocksads123wqasd>
        <some>1</some>
        <ID>2</ID>
    </Blocksads123wqasd>
    <Blocksqweqsari234812w8sqq>
        <test>3</test>
        <ID>2</ID>
    </Blocksqweqsari234812w8sqq>
</root>

这段代码:

def xml = new XmlParser().parseText(xmlText)
xml.'**'.findAll { it.name() == 'ID' && it.text() == '2' }*.parent().each {
    println it
}

返回:

Blocksads123wqasd[attributes={}; value=[some[attributes={}; value=[1]], ID[attributes={}; value=[2]]]]
Blocksqweqsari234812w8sqq[attributes={}; value=[test[attributes={}; value=[3]], ID[attributes={}; value=[2]]]]

编辑1:

根据您的评论,您可以在这种情况下添加虚拟根标签,并且该标签应该可以工作:

String xmlText = "<root>" + originalLogText + "</root>"

originalLogText是:

<block>
    <def>4</def>
    <ID>1</ID>
</block>
<block>
    <some>1</some>
    <ID>2</ID>
</block>
<block>
    <test>3</test>
    <ID>2</ID>
</block>