Как сделать так, чтобы grep игнорировал первые N совпадений в файле, затем печатал (N+1)-ное совпадение и все k строк после него, а затем завершал работу.
3 ответа
Просто отправьте результат в tail(1)
. Например, если N
равно 10, используйте tail +11
чтобы пропустить первые 10 совпадений:
grep pattern file | tail +11
Альтернативное решение в awk
:
awk '/pattern/ { found++ } found > N && printed <= K { print; printed++ }' file
Более читабельно:
awk '
# Initialize to zero for clarity
BEGIN {
found = 0
printed = 0
}
# Check for a pattern match
/pattern/ {
found++
# Found one match
}
# Check if it's the right time to print
found > N && printed <= K {
print
printed++
# Printed once
}' file
Убедитесь, что вы заполнили pattern
, N
и K
мере необходимости.
Первый блок будет отслеживать каждый раз, когда образец найден. Как только это пройдет порог N
, второй блок начинает печатать каждую строку. Второй блок прекратит печать, как только будет достигнут порог K
вы можете использовать awk
awk 'd && k--&&k>=0; c>=3 && /pattern/{d=1;k=2} /pattern/{c++};' file
Сначала /3/{c++}
увеличивает значение c
каждом совпадении с шаблоном. Например, если c
достигнет значения 3, установите флаг (d
) и установите количество строк после него (k=2
). d && k--&&k>=0
означает, что, если значение k
больше 0
и меньше 2
, выведите строки.