1

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

2 回答 2

1

这取决于找到精确匹配的时间是否准确,因为进行算术运算sed很困难。例如,对于完全匹配,此命令使用-nswitch 禁用自动打印并使用范围从与您的时间匹配的行开始打印,直到文件结束 ( $):

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
于 2013-03-12T21:50:41.790 回答
1

我喜欢 perl 做段落-y 的事情:

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

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

于 2013-03-12T22:56:39.193 回答