所以我得到了以下格式的日志:
======================================================== 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
有没有人知道我可以做什么来迭代一个块而不是逐行迭代?
由于
答案 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