-%D0%B5%20%D1%81%D0%BE%D0%B2%D0%BF%D0%B0%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20grep.png)
Как заставить grep игнорировать первые N совпадений в файле, затем вывести (N+1)-е совпадение и все k строк после него, а затем выйти?
решение1
Просто передайте результатtail(1)
. Например, если N
равно 10, используйте tail +11
, чтобы пропустить первые 10 совпадений:
grep pattern file | tail +11
решение2
Альтернативное решение 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
будет достигнут порог.
решение3
вы можете использовать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
, выведите строки.
решение4
grep 'PATTERN' FILENAME | tail -n +M
где M
N+1