3

Есть ли какая-либо утилита для поиска текста, например, в 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" намного длиннее, чем имена разделов.

3 ответа3

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 печать его
2

Давайте рассмотрим этот тестовый файл:

$ 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 , выведите строку.

1

Если число строк, которые следуют за каждым разделом, несколько постоянное, вы можете использовать опцию -A x в grep, чтобы вывести x строк после совпадения раздела. Затем он может быть передан второму 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .