В awk вы бы сделали это следующим образом
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
или
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
объяснение
Первое решение находит все совпадающие строки pattern. Когда он находит совпадение, он сохраняет номер записи ( NR) в массиве nr. Он также хранит 4-ую запись NRв том же массиве. Это сделано nr[NR+4]. Каждая запись ( NR) затем проверяется, чтобы увидеть, присутствует ли она в nrмассиве, если это так, запись распечатывается.
Второе решение работает, по сути, таким же образом, за исключением того, что когда оно встречает, patternпечатает эту строку, а затем сохраняет четвертую запись перед ней в массиве nr, а затем переходит к следующей записи. Затем, когда awkвстретится с этой 4-й записью, NR in nrблок будет выполнен и напечатает эту запись +4 после этого.
пример
Вот пример файла данных sample.txt.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Используя 1-е решение:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Используя 2-е решение:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
egrep "pattern" -A4