Как прочитать определенные строки после нахождения текста?

Как прочитать определенные строки после нахождения текста?

Как я могу прочитать определенное количество строк после того, как найду текст?

Например.:

Прочитайте следующие 2 строки после find "Unix" на:

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9

Результат может быть:

Test 5
Test 6

Примечание: «Unix» в последнем примере является аргументом, поэтому это может быть любой другой текст.

Что у меня есть:

У меня пока нет идей, нужен только свет. Думаю создать еще один сценарий для этого.

решение1

Решение grep:

grep -A2 -P '^UNIX$' file

Объяснение: -Aозначает: вывести следующие две строки после совпадения

Илиawk:

awk '$0=="UNIX"{getline; print; getline; print}' file

Объяснение:Поиск UNIX в строке ( $0=="UNIX"). Если найдено, поместить следующую строку в буфер ( getline) и распечатать буфер ( print). Это делается дважды.

Или используйте sed:

sed -n '/^UNIX$/{n;p;n;p}' file

Объяснение:Поиск UNIX ( /^UNIX$/). Если найдено, выполнить часть в {...}. nозначает следующий, pозначает печать. Это делается также дважды.

решение2

Решение awk:

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

Объяснение

  • /^UNIX$/{i=1;next}: если мы видим UNIX, мы устанавливаем переменную i = 1, обрабатывая следующий вход.

  • Если переменная iустановлена ​​(то есть мы видели UNIX), i && i++ <= 2истинное значение будет оценено только в следующих двух строках после UNIX, что приведет к awkвыполнению действия по умолчанию print $0.

  • До появления UNIX, iне был определен и начинался с 3-й строки после UNIX, iимел значение больше 2, что делало выражение i && i++ <= 2ложным, в результате чего awkничего не происходило.

решение3

grep -A 2 UNIX file.txt

На странице руководства grep эта опция описывается следующим образом:

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.

решение4

Вы можете использовать ex:

ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin

где:

Связанный контент