Простые awk
решения:
Предположим, что регулярное выражение для поиска совпадающих строк хранится в переменной оболочки $regex
, а количество пропускаемых строк - в $count
.
Если совпадающая строка должна также быть пропущенной ($count + 1
строки пропущены):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Если соответствующая строка должна быть не пропущена ($count
строк после совпадение пропущено):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Пояснение:
-v regex="$regex" -v count="$count"
определяет awk
переменные на основе shell переменных с тем же именем.
$0 ~ regex
соответствует линии интереса
{ skip=count; next }
инициализирует счетчик пропусков и переходит к следующей строке, эффективно пропуская совпадающую строку; во втором решении print
перед next
гарантирует, что оно не пропущено.
--skip >= 0
уменьшает число пропусков и предпринимает действия, если оно (все еще)> = 0, подразумевая, что текущая строка должна быть пропущена.
{ next }
переходит к следующей строке, фактически пропуская текущую строку
1
является обычно используемым сокращением для { print }
; то есть текущая строка просто печатается
- Только несоответствующие и пропущенные строки достигают этой команды.
- Причина, по которой
1
эквивалентна { print }
, заключается в том, что 1
интерпретируется как логический шаблон, который по определению всегда оценивается как true, что означает, что его соответствующее действие (блок) выполняется безоговорочно. Так как в этом случае нет связанного действия, awk
по умолчанию печатает строку.