Есть ли какая-нибудь утилита для поиска текста, как в 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