搜索字符串,并检索其后的所有行,直到另一个特定模式

时间:2013-09-16 19:08:34

标签: bash scripting sed awk grep

从unix脚本中,我想在文本文件中搜索字符串,然后返回模式后面的所有行,直到包含单词“Failed”的行。

例如,

Test Case Name "Blah"
Error 1
Error 2
Error 3
Failed
Test Case Name "Foo"
Pass
Test Case Name "Red"
Pass

在上面,我想搜索“Blah”,然后返回:

Error 1
Error 2
Error 3

直到“失败”一行。 “Blah”和“失败”之间可能有任意数量的“错误”行。

任何使用sed,awk等的解决方案都是可以接受的。

谢谢!

2 个答案:

答案 0 :(得分:7)

这是awk版本:

$ awk '/Failed/{p=0}p;/Blah/{p=1}' file
Error 1
Error 2
Error 3

如果您不介意打印边界线,可以

awk '/Blah/,/Failed/' file

一些解释如何工作:awk脚本本质上是一系列具有结构filter{actions}的块,其中过滤器定义了哪些输入记录将应用的操作。

所以第一个块/Failed/{p=0}表示如果我们找到包含正则表达式Failed的记录,我们将变量p设置为零。

第二个块p;使用默认操作,即打印当前记录。因此,对于每个读取的记录,脚本会检查p变量的值,并在p具有非零值(相当于真实条件)时打印记录。

第三个块/Blah/{p=1}表示如果我们找到包含正则表达式Blah的记录,则将变量p设置为1。

因此,如果我们将它们放在一起,脚本就会开始读取所有输入行而不打印它们(因为p的初始值为零)。找到包含Blah的记录后,将打印以下记录,直到找到包含Failed的记录。由于按照它们出现的顺序检查每个记录的块,因此三个块的顺序将决定边界记录发生了什么。例如,如果要打印边界线,我们可以将脚本编写为awk '/Blah/{p=1}p;/Failed/{p=0}' file

第二个命令awk '/Blah/,/Failed/' file使用范围构造(逗号)。范围构造的操作在这里很好地记录:https://www.gnu.org/software/gawk/manual/html_node/Ranges.html

答案 1 :(得分:3)

这可能对您有用:

sed -n '/Blah/,/Failed/{//!p}' file