Awk grep单一日志文件中的多类型错误字符串和文本

Awk grep单一日志文件中的多类型错误字符串和文本,awk,sed,grep,Awk,Sed,Grep,我问过类似的问题,但我觉得这个问题比那个问题更复杂,所以在不同的帖子里问 foo foo foo foo foo Import blash blah blah foo foo foo foo foo blah blah blah blah Error loading file blah blah blah blah blah blah blah blah query run ends foo foo foo foo Import blash blah blah foo foo foo foo

我问过类似的问题,但我觉得这个问题比那个问题更复杂,所以在不同的帖子里问

foo foo foo foo foo
Import blash blah blah
foo foo foo foo foo 
blah blah blah blah 
Error loading file
blah blah blah blah
blah blah blah blah
query run ends
foo foo foo foo
Import blash blah blah
foo foo foo foo foo 
foo foo foo foo foo 
Exception occurred
blah blah blah blah
blah blah blah blah
query run ends
Import blash blah blah
foo foo foo foo foo 
foo foo foo foo foo 
query run ends
在与上面类似的模式中,如果错误异常存在于所有导入结束之间,我想将它们之间的所有内容进行grep。 在这个过程中,我想排除那些没有任何错误或异常字符串的Import&ends组合

注意: 导入和结束字符串之间的行不是常量,可能会有所不同

预期:
GNU
awk
解决方案(假设中间文本中没有出现
Import
关键字):


如果您的数据不包含任何空行,您可以执行以下操作:

nl='
'; sed -n -e "/Import/,/ends/{/ends/s/\$/\\$nl/; p;}" input |
     awk /Exception\|Error/ RS=
这只是对数据进行预处理,以删除
导入
结束
之间未出现的所有行,并在记录之间添加一个空行。对于这种格式的数据,
awk
解决方案非常简单。(我通常不允许将sed转换为awk,但当每个步骤都有不同的记录分隔符时,这样做并不罕见)

如果您的数据可能有空行,您可以使用以下方法进行预处理和后处理:

nl='
'; sed -n -e '/^$/s/^/BLANK LINE/' -e "/Import/,/ends/{/ends/s/\$/\\$nl/; p;}" input |
     awk /Exception\|Error/ RS= | sed 's/^BLANK LINE$//'

注意,有更简洁的方法插入空行。而且,像这样的前/后处理过程存在一定的脆弱性;也就是说,您需要选择一个sentinel(字符串“空行”)作为输入中没有出现的字符串。

与昨天相同,但还有一个条件

sed '/^Import/!d;:A;N;/\nImport/{h;s/.*\n//;bA};/ends$/!bA;h;s/\nException//;tB;s/\nError//;tB;d;:B;x' infile

当此块包含“错误”或“异常”时,使用
awk
从“导入”打印到“结束”

示例输入的输出

Import blash blah blah
foo foo foo foo foo 
blah blah blah blah 
Error loading file
blah blah blah blah
blah blah blah blah
query run ends

Import blash blah blah
foo foo foo foo foo 
foo foo foo foo foo 
Exception occurred
blah blah blah blah
blah blah blah blah
query run ends

将当前输入的最终预期结果发布在QueryTanks@RomanPerekhrest中,如果日志模式在“ends”和下一个“Import”之间包含一些其他记录,是否可以将“ends”关键字也放在RS中,这将很有帮助?也用模式的更改更新了原始日志注意,为RS使用多个字符是gnu awk的扩展,不会在awk的所有实现中都起作用。
nl='
'; sed -n -e '/^$/s/^/BLANK LINE/' -e "/Import/,/ends/{/ends/s/\$/\\$nl/; p;}" input |
     awk /Exception\|Error/ RS= | sed 's/^BLANK LINE$//'
sed '/^Import/!d;:A;N;/\nImport/{h;s/.*\n//;bA};/ends$/!bA;h;s/\nException//;tB;s/\nError//;tB;d;:B;x' infile
awk '/Import/,/ends/                 {s = s "\n" $0} 
     /ends/ && s ~ /Error|Exception/ {print s; s=""}' file
Import blash blah blah
foo foo foo foo foo 
blah blah blah blah 
Error loading file
blah blah blah blah
blah blah blah blah
query run ends

Import blash blah blah
foo foo foo foo foo 
foo foo foo foo foo 
Exception occurred
blah blah blah blah
blah blah blah blah
query run ends