命令在模式后打印段落



我有一个日志文件,其中的数据条目如下:每个条目以time:开头现在我想只打印特定时间之后的条目。例如,在time : 20130309235926之后,我想打印所有记录,所以在我的例子中,它应该打印最后2条记录。

是否有一个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
-

我喜欢用perl来处理段落:

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

-00标志提供段落输入(以空行分隔)

这取决于是否找到匹配的时间,因为用sed做算术是困难的。例如,对于精确匹配,该命令使用-n开关禁用自动打印,并使用一个范围从与您的时间匹配的行打印到文件结束($):

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

编辑修复上一个命令:

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

最新更新