grep for Error并打印包含上下两个字符串的所有行错误

时间:2017-11-21 12:05:02

标签: bash sed

saaa vcahJJ HKak vk     
Import xxx xXXXXX xxxx
aaaa aaaa  aaaa ffffff
hhhhhh hhhhhh hhh hhh  hhhhhh
Error reading readStatus api
aaa hhhh aaa aaaaa
gggggggg ggggg xxxxxxxxxx
uuuu hhhhhhhh fffffffff
query run ends
qidIdih II v iQE Iqe

我想在包含上述日志的文件中找到'Error'字符串,然后打印2个字符串'Import''ends'之间的所有可用信息。 如何使用grep/sed执行此操作 试过this 但并没有得到太多。 注意:我不知道之前和之后会有多少行。它可能与我提供的上述样本不同

4 个答案:

答案 0 :(得分:0)

Grep的-A 1选项会给你一行; -B 1之前会给你一行;并且-C 1结合了两者,在你之前和之后给你一行。

grep -C 1 "Error" <logfile>

根据您的要求,您可以使用 -

sed -n '/Import/,/ends/p' filename

答案 1 :(得分:0)

怎么样:

$ awk 'BEGIN{RS=ORS="ends\n"} /Error/' file

RS是输入记录分隔符,需要endsORS为输出目的获取相同的值。此外,您的示例有/^Error/,但Error未启动记录(^)。

答案 2 :(得分:0)

你在这里:

out=$( sed -n '/^Import/,/end$/p' file )
echo "$out" | grep Error >/dev/null && echo "$out"

这将捕获“导入”和“结束”之间的文本,并仅在提取的文本包含“错误”时打印它。

答案 3 :(得分:0)

你可以试试这个sed

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

说明:

sed '
/^Import/!d                 # if a line start with Import
:A
N                           # get an other line
/\nImport/{h;s/.*\n//;bA}   # if the last line start with Import
                            # keep only this last line and return to A
/ends$/!bA                  # If the last line end with ends
h                           # keep all the lines in the hold space
s/\nError//                 # look for a line which start with Error
tB                          # if find jump to B
d                           # not find, delete all and return to the start
:B
x                           # restore all the lines and print
' infile