Как я могу прочитать определенное количество строк после того, как найду текст?
Например.:
Прочитайте следующие 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
где:
1,/UNIX/d
-удаляет текст после совпадения%p
- буфер печатиq!
- выйти без сохранения изменений в файле (используйтеwq
для редактирования на месте)