从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等的解决方案都是可以接受的。
谢谢!
答案 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