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

时间:2017-11-22 11:21:15

标签: awk sed grep

我问了类似的问题here,但我觉得这个问题比这更复杂,在不同的帖子中提问。

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&结束组合,它没有任何错误或异常字符串。

注意:

导入&结束字符串不是常数,可能会有所不同。

预期:

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

4 个答案:

答案 0 :(得分:0)

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

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

这只是预处理数据以删除Importends之间没有出现的所有行,并在记录之间添加一个空行。使用该格式的数据,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$//'

注意,有更简洁的方法可以插入空白行。此外,这样的前/后处理有一定的脆弱性;也就是说,你需要选择一个标记(字符串" BLANK LINE")作为输入中没有出现的字符串。

答案 1 :(得分:0)

和昨天一样,还有一个条件。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

GNU awk 解决方案(假设Import关键字未出现在中间文字中):

awk -v RS='Import' '$0~/\<(Error|Exception)/{ printf "%s%s",RS,$0 }' file
  • -v RS='Import' - 将Import关键字视为记录分隔符

输出:

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