Grep для нескольких строк, покажите количество строк после одной из строк (но не другой)

Как следует из названия, я хотел бы искать файл для нескольких строк и для одной конкретной строки, также показать 5 строк.

cat file | grep -e 'string1' -e 'string2' 

конечно, но я хотел бы получить что-то вроде

 cat file | grep -e 'string1' -e -A 5 'string2' 

Как я могу сделать это так, что (я предполагаю использовать параметр -A 5) он показывает только строки, содержащие строку string1, и только строки, содержащие string2 и 5 строк после строки2, но не 5 строк после строки1?

EDIT: только что он работал с awk:

 cat file | awk '/string1/{c=1}/string2/{c=5}{while(c-->0){print;getline}}' 

Вы не можете сделать это, используя один grep . Вам нужно использовать два экземпляра grep :

 grep 'string1' file; grep -A 5 'string2' file 

Если вы хотите запустить второй после успеха первого:

 grep 'string1' file && grep -A 5 'string2' file 

о awk-коде

 awk '/string1/{if ( c<=0 ) c=1 ;}/string2/{c=5}{ if (c-->0) print;}' file 
  • не cat ... | awk cat ... | awk , awk может читать файл.
  • Я перестраиваю тест (если строка1 является одной строкой после строки2, она прерывает печать в решении OP)

Sed раствор:

 sed -n '/string2/,+4{p;b;};/string1/p' file 

мой sed также принимает ~ вместо +