我有一个日志文件,其中的数据条目如下:每个条目都以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
-
答案 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
标志提供段落中的输入(用空行分隔)