Игнорировать первые N совпадений и вывести (N+1)-е совпадение в grep

Игнорировать первые N совпадений и вывести (N+1)-е совпадение в grep

Как заставить 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

где MN+1

Связанный контент