Как сделать так, чтобы 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 , выведите строки.
