Прості 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змінні на основі однойменних змінних оболонок .
$0 ~ regex відповідає лінії інтересу
{ skip=count; next }ініціалізує кількість пропусків і переходить до наступного рядка, ефективно пропускаючи відповідну лінію; у 2-му розв’язку printпопереднє nextгарантує, що воно є не буде пропущено.
--skip >= 0 зменшення кількості пропусків і вживає заходів, якщо це (все-таки)> = 0, маючи на увазі, що поруч слід пропустити лінію.
{ next } переходить до наступного рядка, фактично пропускаючи поточний рядок
1 - це часто використовувана стенограма для { print } ; тобто поточний рядок просто друкується
- Тільки невідповідні та пропущені рядки досягають цієї команди.
- Причина,
1еквівалентна { print }тому, що 1інтерпретується як булева модель, яка за визначенням завжди оцінюється як істина, а це означає, що пов'язана з нею дія (блок) беззастережно виконується. Оскільки в цьому випадку жодної асоційованої дії немає , awkза замовчуванням друкується рядок.
+Nшаблон є розширенням GNU. Змініть першийnна наNдругий приклад, щоб він включав рядок з малюнком.