Найти шаблон строки в файле/входе, контекстно-зависимый поиск (не как 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 TWOиsection THREE
    • { /text_c/p;}определяет функцию, которая будет сопоставлять строку с text_cи если найдет, то выведет pее на экран

решение3

Если количество строк, следующих за каждым разделом, более или менее постоянно, можно использовать '-AИкс' опция в grep для печатиИксстроки, следующие за разделом соответствия. Затем это можно передать во второй grep, который ищет ваш шаблон в 'section TWO'.

$ 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

Связанный контент