Как показать строки после каждого совпадения grep до другого конкретного совпадения?


45

Я знаю, что с помощью "-A NUM"переключателя я могу печатать определенное количество строк после каждого совпадения. Мне просто интересно, можно ли печатать конечные строки, пока после каждого совпадения не будет найдено определенное слово. Например, когда я ищу «Слово А», я хочу видеть строку, содержащую «Слово А», а также строки после него, пока не появится строка, содержащая «Слово D».

контекст:

Word A
Word B
Word C
Word D
Word E
Word F

команда:

grep -A10 'Word A'

Мне нужен этот вывод:

Word A
Word B
Word C
Word D

Ответы:


75

Кажется, вы хотите напечатать строки между ' Word A' и ' Word D' (включительно). Я предлагаю вам использовать sedвместо grep. Это позволяет вам редактировать диапазон входного потока, который начинается и заканчивается желаемыми шаблонами. Вам просто sedнужно распечатать все строки в диапазоне и никаких других строк:

sed -n -e '/Word A/,/Word D/ p' file

Любые советы о том, как сделать его эксклюзивным (для любой общей ситуации, а не только для OP)?
2rs2ts

5
@ 2rs2ts, чтобы сделать его эксклюзивным, просто добавьте | sed -e '1d;$d', то есть удалите первую и последнюю строку
holroy

И если вы хотите исключить все строки между - то есть вы хотите просто видеть строки, находящиеся за пределами двух совпадений - тогда: sed -n -e '/pattern A/,/pattern D/d; p'Это говорит: «удалите из шаблона A в шаблон D и напечатайте все остальное». К сожалению, этот матч жадный. Это означает, что если шаблоны A и D появляются более одного раза, вы будете сравнивать от первого шаблона A до последнего шаблона D. Я боюсь, что Perl или Python - ваши друзья, если это так.
fbicknel

16

почему бы не использовать awk?

awk '/Word A/,/Word D/' filename

2
Похоже, что sed может сделать это гораздо эффективнее, если задействовано большое количество файлов. awk может быть легче запомнить, но sed, похоже, стоит заметить в моем мозгу.
JimNim

1
awk лучше, если он Word Dнаходится на той же строке Word A, что и, возможно, где-то еще, например, Word A Word D\nWord Dс помощью sed будет показано две строки, где awk покажет одну. Кроме того, можно по-прежнему использовать переменные с awk, например awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file", так что sed может быть более эффективным, но при работе с поиском двух строк, которые могут или не могут находиться на одной строке, awk определенно будет более надежным.
S0AndS0

кажется , что AWK лучше обрабатывает случай , что файл содержит последовательности Aи , Bи вы только хотите , чтобы захватить то , что между каждой такой последовательностью. похоже, что в моем случае sed не следует этой семантике, по крайней мере.
Матан

9
perl -lne 'print if /Word A/ .. /Word D/' file

или

cat file | perl -lne 'print if /Word A/ .. /Word D/'

1
+1 для противодействия понижающему голосованию. Я бы по-прежнему использовал sedэто, если вам не нужна мощь регулярных выражений Perl для выбора разделительных строк.
tripleee

Люди, написавшие sed в 70-х, должны быть благодарны :-)
Матан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.