2013-03-12 3 views
1

У меня есть файл журнала, в котором находятся записи данных: каждая запись начинается с time: Теперь я хочу напечатать только записи через определенное время. Например, после я хочу распечатать все записи, поэтому в моем случае он должен распечатать последние 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

ответ

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 

EDIT добавить предыдущую команду в одну строку:

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

Сюда входит первая запись. Возможно, вы можете выполнить пост-обработку, чтобы вырезать эту запись. – paddy

+0

@paddy: Вы правы. Я этого не понимал. Я постараюсь это исправить. – Birei

+0

На самом деле, я не хочу первой записи, так или иначе? – user2162950

1

Мне нравится Perl для делать пункт-й вещи:

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

Флаг -00 обеспечивает ввод в пунктах (разделенных пустыми строками)

Смежные вопросы