如何匹配sed模式:

时间:2014-03-12 12:06:03

标签: sed

我有以下日志:

File Process Start : 2014-03-12 - 10:43:40
UnZipping File : fetch_export?id=t63184&file=4
Extracted File : exp_4.mbx
Expected Messages : 6236
File Process Start : 2014-03-12 - 10:57:38
UnZipping File : fetch_export?id=t63185&file=39
Extracted File : 
Expected Messages : 0
File Process Start : 2014-03-12 - 10:57:38
UnZipping File : fetch_export?id=t63185&file=33
Extracted File : 
Expected Messages : 0
File Process Start : 2014-03-12 - 10:57:38
UnZipping File : fetch_export?id=sept2012&file=61
Extracted File : exp_61.mbx
Expected Messages : 7935

我需要在此命令中更改什么?

sed -n  '/File Process Start/,/Expected Messages/p'

我只需要在

之间输出
File Process Start
...
Expected Messages : 0

像这样:

File Process Start : 2014-03-12 - 10:57:38
UnZipping File : fetch_export?id=t63185&file=39
Extracted File : 
Expected Messages : 0
File Process Start : 2014-03-12 - 10:57:38
UnZipping File : fetch_export?id=t63185&file=33
Extracted File : 
Expected Messages : 0

2 个答案:

答案 0 :(得分:2)

我们的想法是在" 文件处理开始... "之间打印线条。和" 预期消息:0 "。问题是您事先不知道是否会找到" 预期消息:0 "或" 预期消息:X "。因此,从" 文件处理开始"开始,继续将行保存在保留空间中,直到您能够决定是打印它们还是丢弃它们。

sed -n '/Expected Messages : 0/{H;g;p};/.*/H;/File Process Start/h' log.txt

伪代码是:

  • 如果该行包含" 预期消息:0 ",( h )会将此行添加到保留空间(此处点,保持空间将有行" 文件处理开始... "," 解压文件... &#34 ;和" 提取文件... "),( g )从保留空间获取内容到模式空间(即来自" 文件处理开始... "直到您刚刚附加的最后一个),( p )打印图案空间的内容。

  • 如果该行包含其他内容,( H )会将其附加到保留空间。

  • 如果该行包含" 文件处理开始",( h )清除保留空间中的内容并把这条新线放在那里。

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -n '/File Process Start/{h;d};H;/Expected Messages : 0/{g;p}' file