Как я могу прочитать определенное количество строк после поиска текста?
Например.:
Прочитайте следующие 2 строки после поиска "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» в последнем примере является аргументом, и поэтому это может быть любой другой текст.
Что я имею:
У меня все еще нет идей, нужен только свет. Думая о создании другого сценария, чтобы сделать это.
$
знак в начале моего ответа является приглашением оболочки, а не частьюawk
команды.awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
grep
Решение:Пояснение:
-A
означает: вывести следующие две строки после совпаденияИли
awk:
Объяснение: Этот оператор ищет UNIX в строке (
$0=="UNIX"
). Если это дано, он получает следующий следующий в свой буфер (getline
) и печатает буфер (print
). Это делается дважды.Или используйте
sed
:Объяснение: Это ищет для UNIX (
/^UNIX$/
). Если это найдено, он выполняет часть в{...}
.n
означает следующее,p
значит печать. Это сделано в два раза.источник
getline; print;
часть вawk
выписке илиn;p;
часть вsed
выписке.grep -A100 -P '^UNIX$' file | tail -n +2
. Хвостовая часть предназначена для удаления первой селезенки. В других (sed, awk) вам придется писать циклы, что делает его менее простым.Man-страница grep описывает эту опцию так:
источник
UNIX
на выходе.UNIX
, трубы егоtail
:[...] | tail -n +1
илиsed
:[...] | sed '1d'
.tail
иsed '1d'
предложения работают правильно только в том случае, если ониUNIX
появляются только один раз во входном тексте. Все остальные ответы допускают множественные вхождения. Может быть, лучше предложить... | grep -v UNIX
. По общему признанию, это становится грязным, еслиUNIX
появляется в строках 15 и 17.sed
какой-то формеsed '/UNIX/d;n;n;p/' /path/to/file
, которую я только что обдумал и представил в качестве ответа.Кажется, это хорошо сработало:
Подтверждение концепции:
источник
for
петли не нужна.Вы можете использовать
ex
:где:
1,/UNIX/d
- удаляет текст после матча%p
- печатает буферq!
- выйти без сохранения изменений в файл (используйтеwq
для редактирования на месте)источник