删除最后一行有条件的行块

删除最后一行有条件的行块

我有一个日志文件,在一系列行的末尾,您可以查看该块是否相关。现在我正在寻找像 sed 这样的命令来删除以“Content-Length: 0”结尾并以该行之前的最后一个“--”开头的块。

我尝试过 sed -n "/--/,/Content-Length: 0/d",但这需要第一个“--”和第一个“Content-Length:0”并将其删除。

前任 :

line 1 "--"  
line 2   
line 3 "Content-Length: 20"  
line 4 "--"  
line 5  
line 6 "Content-Length: 0" 

我想删除第 4,5 行和第 6 行,而不是第 1 行到第 6 行

我怎样才能做到这一点?

答案是使用tac而不是cat完成工作!但最终我想在tail -f建筑中使用它

答案1

这是使用的一种方法GNU sed

sed -n '/--/,/Content-Length: 0/ { H; /Content-Length: 0/ { g; s/\n\(.*\)\n.*--.*/\1/p } }'

结果:

line 1 "--"  
line 2   
line 3 "Content-Length: 20"  

解释:

Match between the pattern range. Append this range to the hold space. On the last
line of the range, copy the hold space to pattern space to work with it. Then use
find/replace regex to remove everything after the last occurrence of '--'. HTH.

答案2

尝试

sed -n "N;s/--.*Content-Length: 0//;P"

答案3

如果存在 tac 命令,请使用 tac 以便我们可以检查反向模式:

tac file | sed "/Content-Length: 0/,/--/d" | tac

答案4

你可以这样做:

sed 'H;/^--$/h;/Content-Length.*[1-9]/!d;g'

这会附加每一行以保留空间。标记--线会覆盖保留空间 - 因此您可以为每次--通过都使用一个新的缓冲区内容块。所有不包含该字符串的行内容长度然后在某个时刻后跟至少一位非 0 的数字,然后将其删除。因此,您最终可以将保留空间放回到模式空间并打印它的唯一机会g是在匹配的行上内容长度然后某个非 0 的数字此时,自最后一行以来的每一行--都会被打印。

相关内容