2015-04-01 47 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時間函數來計算你需要做的任何時間。

相關問題