如何删除日志文件中的文本块?

如何删除日志文件中的文本块?

我有以下日志:

2016/01/20 00:00:16.035 [T114BaseServlet] ... Blah Blah Blah
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
2016/01/20 00:00:29.531 [T114BaseRequestPayloadParser] ... Blah Blah Blah
2016/01/20 00:00:36.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah

我想删除这些ApplicationState行,但这些行的末尾没有模式Blah Blah Blah

这是我要删除的块:

2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah

在下一个请求开始之前。

答案1

要删除从 1 开始的整个行块,包括您的匹配项,直到下一次出现的行之前出现的行,[T1114Base您可以执行以下操作:

sed -e'$!N;/ApplicationState.*\n/,/\n.*\[T1114Base/!P;D' <in >out

理解其工作原理相当简单。默认情况sed下一次吃一行输入。但如果你想要更广阔的视野,你只需要编写脚本即可。

因此,对于每个输入行,如果当前行不是!最后$一行,则将 ext 行sed附加到由插入的ewline 字符N分隔的模式空间。\n

在范围表达式中,我首先查找任何匹配项ApplicationState后跟任意*数量的任意.字符,后跟至少一个\newline。要结束范围表达式,我需要查看输入 - 这$!N首先是 的目的。sed扫描下一次出现的行最后一个要删除的。它查找一条\newline,后跟一个模式,该模式应与下一个输入块的开头匹配。

如果该范围表达式!不匹配,sedP打印到\n模式空间中第一个出现的换行符,并且无论匹配如何,sed随后都会D删除模式空间中第一个出现的换行符,并用剩余的内容回收到脚本的顶部。

基本上,sed一次滑过输入 2 行,P如果它没有出现在删除块中,则可能会打印最旧的一行,并且D在附加扩展之前始终仅删除最旧的一行N

答案2

你真的尝试过吗?

假设您要删除整行:

sed '/ApplicationState/d' inputfile

相关内容