仅在使用记录分隔符后打印具有匹配字段的记录

时间:2015-04-01 01:29:09

标签: regex awk grep

我有一堆记录,我只想查看字段(或多个字段)与正则表达式匹配的记录。

例如,假设我的数据的形式如下:

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将它们拆分成记录,但是我如何只打印具有不同部分匹配的记录?假如我想找到EndTime16:20之间16:30Time长于1秒([0-9]{4,})的所有记录中间是否有任意数量的行?

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

1 个答案:

答案 0 :(得分: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时间函数进行数学运算。