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

Regex 仅打印使用记录分隔符后具有匹配字段的记录,regex,awk,grep,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=

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

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

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
如果我在寻找一个单一的模式,并且每条记录都有相同数量的行,那么这很好,但是一旦我必须寻找具有自己模式的多个字段,情况就会变得更加复杂

我要做的是将这些输入中的每一个分离到一个记录中,然后只打印与我要查找的模式匹配的1个或多个字段的每个记录

我可以使用
RS
将它们拆分为记录,但如何仅打印具有不同匹配部分的记录?比如说,如果我想查找所有的记录,这些记录的
EndTime
介于
16:20
16:30
之间,并且
时间
超过1秒(
[0-9]{4,}
),而其间可能有任意数量的行

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

听起来您的主要问题是如何访问数据,而不是在获得数据后如何测试数据,因此:只要输入中有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
$cat tst.awk
开始{RS=“\nEOE\n-+\n”FS=“\n”OFS=“,”}
{
删除n2v
对于(i=1;i