До сих пор было дано много хороших ответов на этот вопрос, но я все еще скучаю по одному с awk
, не использующим getline
. Поскольку, в общем , использовать getline
не обязательно, я бы сказал:
awk ' f && NR==f+1; /blah/ {f=NR}' file #all matches after "blah"
или
awk '/blah/ {f=NR} f && NR==f+1' file #matches after "blah" not being also "blah"
Логика всегда состоит в том, чтобы сохранить строку, в которой находится «бла», а затем распечатать те строки, которые идут на одну строку после.
Test
Пример файла:
$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7
Получить все строки после "бла". Это печатает другой "бла", если он появляется после первого.
$ awk 'f&&NR==f+1; /blah/ {f=NR}' a
1
4
blah4
7
Получить все строки после "бла", если они не содержат "бла" сами.
$ awk '/blah/ {f=NR} f && NR==f+1' a
1
4
7