sed命令在模式后打印段落

时间:2013-03-12 21:35:05

标签: sed paragraphs

我有一个日志文件,其中的数据条目如下:每个条目都以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
-

2 个答案:

答案 0 :(得分:1)

这取决于是否准确找到匹配的时间,因为使用sed进行aritmethic很困难。例如,对于完全匹配,此命令使用-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  

编辑将上一个命令添加为一行:

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

答案 1 :(得分:1)

我喜欢perl做段落事情:

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

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