在文件/输入中查找字符串模式,上下文相关搜索,(不像 grep)

在文件/输入中查找字符串模式,上下文相关搜索,(不像 grep)

是否有任何实用程序可用于查找文本,例如在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 TWOsection 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

相关内容