如何编写Groovy脚本来逐块迭代特定字段

时间:2018-05-22 14:41:09

标签: groovy

所以我得到了以下格式的日志:

======================================================== BEGIN]
MessageID: 123
UAN: 321
======================================================== END]
======================================================== BEGIN]
MessageID: 111
UAN: 222
======================================================== END]
======================================================== BEGIN]
MessageID: 343
UAN: 311
======================================================== END]

是否有可能编写一个groovy脚本,让您遍历每个块,该块正在"开始"和"结束"并且基本上搜索特定的UAN,并找到那个uan,返回messageID。

这就是我现在所拥有的:

Faker faker = new Faker()

def fileName = "C:\\Users\\xxx\\Desktop\\log.txt";
Path path = Paths.get(fileName);

def uan= "222"

def logSection = faker.logExtractor().getSectionOfLog(uan, path);

log.info logSection

有没有人知道我可以做什么来迭代一个块而不是逐行迭代?

由于

1 个答案:

答案 0 :(得分:0)

下面会创建一个地图,您可以在其中查找uan:

def str = '''\
======================================================== BEGIN]
MessageID: 123
UAN: 321
======================================================== END]
======================================================== BEGIN]
MessageID: 111
UAN: 222
======================================================== END]
======================================================== BEGIN]
MessageID: 343
UAN: 311
======================================================== END]'''

def map = str.readLines().collect { 
  it.trim()
}.findAll { 
  !it.startsWith('==') && (it.startsWith('MessageID') || it.startsWith('UAN'))
}.collect { 
  it.tokenize(':')[1].trim()
}.collate(2).collectEntries { 
  it.reverse() 
}

println(map['222'])

打印:

111

这对您的日志文件格式做了一些假设,更多的是作为如何使用基于行的数据的示例。

另一种方法是使用groovy字符串eachMatch method

str.eachMatch(/(?s)BEGIN.\s*(.+?)\s*=+ END/) { m -> 
  def (mid, uan) = m[1].readLines().collect { it.trim().tokenize(':')[1].trim() }
  println "messageId: $mid, uan: $uan"
}

打印:

messageId: 123, uan: 321
messageId: 111, uan: 222
messageId: 343, uan: 311