Распечатайте несколько строк до и после соответствия шаблону, исключая строки, соответствующие другим шаблонам

Я использую awk для Solaris для печати 5 строк до и после соответствия шаблону. В настоящее время работает следующий однострочный:

/usr/xpg4/bin/awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=5 a=5 s="ERROR" file 

Однако результат не является удовлетворительным. Прежде всего, он содержит нежелательные строки, такие как

  • линии с самой совпадением
  • пустые строки
  • линии, соответствующие (нежелательным) шаблонам, например
    • Удалить
    • бред какой то
    • глупый

Кроме того, существует требование, чтобы каждое основание было разделено линией с некоторыми тире.

Пример ввода:

 stupid remove keep it * MATCH keep it as well remove important * MATCH at line 2: needed also this line should be kept * MATCH at line 2: this to save very important remove keep it * MATCH keep it as well nonsense another nonsense 

Ожидаемый результат:

 keep it keep it as well --- important needed also --- this line should be kept this to save very important --- keep it keep it as well 

Как это можно достичь с помощью элегантного способа?

One Solution collect form web for “Распечатайте несколько строк до и после соответствия шаблону, исключая строки, соответствующие другим шаблонам”

Хотя ожидаемый результат не ясен, я постараюсь. Если у вас есть gnu utils на Solaris, вы можете использовать gawk и ggrep очень просто:

 gawk 'NF > 0' fileName |ggrep -C5 pattern 

Вы можете добавить | ggrep -v somePattern в конце, чтобы отфильтровать нежелательные слова.

  • Почему это совмещение регулярных выражений?
  • Извлеките две строки после строки с определенным значением
  • Удалите определенные объекты из плоской базы данных файлов
  • как использовать awk / cut для получения данных столбца, имеющего пространство
  • извлекать текст между двумя разными совпадениями
  • Bash Scripting: печать данных столбца в одной строке
  • Как я могу удалить пятое слово каждой строки в файле?
  • Как выполнить действие только в первой строке?
  • как я могу прокомментировать / в разделе в исходном коде с sed или awk
  • Удаление символов в определенном столбце перед определенным символом
  • Linux + захватывает только IP из команды mount
  • Linux и Unix - лучшая ОС в мире.