2015-04-01 39 views
0

我有一堆记录,而且我只想查看字段(或多个字段)与正则表达式模式匹配的记录。只有在使用记录分隔符后才打印具有匹配字段的记录

例如,说我的数据来自于这样一种形式:

Time=181 ms 
RequestId=12345 
Method=GET 
... # other records 
EndTime=Tue Mar 5 16:21:03 2015 UTC 
EOE 
------------------------------------------------------------------------ 
Time=4003 ms 
RequestId=53224 
Method=POST 
... # other records 
EndTime=Tue Mar 5 16:21:09 2015 UTC 
EOE 
------------------------------------------------------------------------ 

之前,我已经做了它的方式是使用grep-A-B标志提取上下文。

zgrep "16:2[0-5]:" -A 1 -B 10 data.txt 

这工作得很好,如果我要寻找一个单一的模式,每个记录行相同量,但一旦我必须寻找自己的模式多领域变得更加复杂。

我想要做的是将这些输入中的每一个分隔成一条记录,然后只打印每个记录中的一个或多个字段匹配我所寻找的模式。

我可以使用RS将它们拆分成记录,但是如何才能打印具有不同部件匹配的记录?假如我想查找16:2016:30之间的EndTime以及Time长于1秒([0-9]{4,})的所有记录,当中间可能有任意数量的行时?

awk 'BEGIN { RS = "EOE" } { ??? }' data.txt 

回答

0

这听起来像你的主要问题是如何访问数据,而不是如何测试你有后,所以:只要你有name = value对输入这是一个好主意,构建一个name2value数组,然后你可以通过名称来访问值:

$ cat tst.awk 
BEGIN { RS="\nEOE\n-+\n"; FS="\n"; OFS="," } 
{ 
    delete n2v 
    for (i=1;i<=NF;i++) { 
     name = gensub(/=.*$/,"","",$i) 
     value = gensub(/[^=]+=/,"","",$i) 
     n2v[name] = value 
    } 
    print n2v["Time"], n2v["RequestId"], n2v["Method"], n2v["EndTime"] 
} 

$ awk -f tst.awk file 
181 ms,12345,GET,Tue Mar 5 16:21:03 2015 UTC 
4003 ms,53224,POST,Tue Mar 5 16:21:09 2015 UTC 

上面使用一些GNU awk的扩展。使用gawk时间函数来计算你需要做的任何时间。

相关问题