是否有任何实用程序可用于查找文本,例如在grep
(linux)或findstr
(dos)中,但仅在找到另一个给定的文本/模式后才开始查找?
就像尝试在文件中查找给定的文本/模式,但只能查找位于文件特定部分内的文本/模式。在我的例子中,只有“文件”是另一个程序的输出,输出的行数太多,无法写入文件并在那里进行分析。
例子:
section ONE
text_a
text_b
text_c
section TWO
text_b
text_c
section THREE
. . .
仅查找第二部分中是否有“text_c”。
我尝试阅读 的grep
选项,但它似乎没有这个功能。这也是为了尽量减少字符串比较的数量,因为“text_c”比节名长得多。
答案1
让我们考虑这个测试文件:
$ cat file
section ONE
text_a
text_b
text_c <-ignore this
section TWO
text_b
text_c <-keep this
section THREE
text_a
text_b
text_c <-ignore this
要选择包含text_c
以下内容的任何行section TWO
:
$ awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/' file
text_c <-keep this
如果输入不是从文件生成而是从生成command
,则使用:
command | awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/'
怎么运行的
/^section/{f=0}
只要我们发现以 开头的行
section
,就设置f=0
。/^section TWO/{f=1}
如果该行以 开头
section TWO
,则覆盖前一个命令并设置f=1
。f && /text_c/
如果
f
非零并且当前行匹配text_c
,则打印该行。
答案2
您还可以使用sed
类似方法执行此操作:
command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'
其工作原理是:
-n
告诉sed
默认情况下不打印匹配的行-e
给出sed
一个脚本来运行/section TWO/,/section THREE/
设置我们的地址范围,所以我们将把下一个函数应用于匹配的行之间的所有行section TWO
,section THREE
{ /text_c/p;}
定义匹配行的函数text_c
,如果找到则p
打印该行
答案3
如果每个部分后面的行数比较固定,则可以使用'-AX' grep 中的打印选项X行跟在节匹配之后。然后可以将其传送到第二个 grep,该 grep 在“第二节”中查找您的模式。
$ cat file
section ONE
1 text_a
1 text_b
1 text_c
section TWO
2_text_a
2 text_b
2 text_c
section THREE
3 text_a
3 text_b
3 text_c
$ grep -A3 'section TWO' file | grep text_c
2 text_c