2013-03-12 41 views
1

我有一個日誌文件,其中的數據條目如下:每個條目以time: 開頭現在我只想在特定時間後打印條目。例如,在time : 20130309235926之後,我想打印所有記錄,所以在我的情況下,它應該打印最後2條記錄。sed命令在圖案後打印段落

是否有一個sed命令來做到這一點?

time: 20130309235926 
dn: 
changetype: modify 
- 
replace: modifiersname 
modifiersname: 
dc= 
- 
replace: modifytimestamp 
modifytimestamp: 20130310045926Z 
- 

time: 20130309235959 
dn: 
changetype: modify 
- 
replace: modifiersname 
modifiersname: 
dc= 
- 
replace: modifytimestamp 
modifytimestamp: 20130310045926Z 
- 

time: 20130308025010 
dn: 
changetype: modify 
- 
replace: modifiersname 
modifiersname: 
dc= 
- 
replace: modifytimestamp 
modifytimestamp: 20130310045926Z 
- 
+0

不確定關於'sed',但'awk'可能對這類事情有用。 – paddy 2013-03-12 21:42:01

回答

1

這取決於如果時間找到匹配準確與否,因爲這樣做aritmethic與sed是困難的。例如,對於完全匹配,此命令使用-n開關禁用自動打印,並使用範圍從匹配的時間,直到文件的末尾行($)打印:

sed -n '/time:[ ]*20130309235926/,$ p' infile 

EDIT修正先前的命令:

sed -n ' 

    ## When found a blank line between a line with your time and end of file, 
    ## jump to label "a". 
    /time:[ ]*20130309235926/,$ { 
    /^[ ]*$/ ba 
    }; 

    ## Skip all lines until previous condition be true. 
    b; 

    ## Label "a". 
    :a; 

    ## Save all content from next entry until end of file. 
    $! { 
    N; 
    ba 
    }; 

    ## Remove extra newline and print. 
    s/^\n//; 
    p 

' infile 

編輯以添加前一個命令作爲一個行:

sed -n '/time:[ ]*20130309235926/,$ { /^[ ]*$/ ba }; b; :a; $! { N; ba }; s/^\n//; p' infile 
+0

這包括第一條記錄。也許你可以通過後期處理來減少這個記錄。 – paddy 2013-03-12 22:03:43

+0

@paddy:你說得對。我沒有意識到這一點。我會盡力解決它。 – Birei 2013-03-12 22:05:58

+0

其實我不想第一個唱片,反正要做那個? – user2162950 2013-03-13 19:07:11

1

我喜歡做段落-γ有關Perl:

perl -00 -ne '$t = (/time: (\d+)/)[0]; print if $t gt "20130309235926"' 

-00標誌提供了在段中的輸入(由空行分隔)