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

Я использую 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 

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

  • Удалить ведущее 0 из определенного поля
  • Заменить значения в столбце, содержащем числа
  • файл поиска для строки (взятый из файла), затем замените любой экземпляр другой строки, которая попадает в первое совпадение
  • sed - найти строку из 4 чисел с предшествующим символом и добавить символ
  • значение столбца печати, основанное на совпадении имени столбца в awk / sed
  • Удалите строки между двумя тегами (с некоторыми ограничениями)
  • Как заменить несколько пустых строк на определенную непустую строку?
  • Обмен двумя столбцами в CSV с использованием SED
  • One Solution collect form web for “Распечатайте несколько строк до и после соответствия шаблону, исключая строки, соответствующие другим шаблонам”

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

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

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

    Interesting Posts

    Как я могу принудительно использовать конкретный двоичный файл при запуске скрипта

    Работает ли ионика с планировщиком сроков?

    Как я могу улучшить скорость попадания кеша nscd?

    Проблема с синтаксисом Sed

    Не удается запустить X-серверы на разных вкладках дисплея

    Есть ли лучшие / более безопасные методы запуска OpenVPN-клиента как обычного пользователя?

    pwd: показать точку монтирования

    Как удалить значки из кнопок

    цикл через несколько папок и выполнять команды, а затем записывать в файл

    Пространственно-эффективная файловая система Linux для музыкального диска?

    Настройка подсветки клавиатуры не сохраняется при возобновлении с приостановки

    Есть ли хороший инструмент тестирования пыток на диске?

    Как установить ключ RPM в моей системе Amazon Linux?

    Соответствие пяти столбцов в двух файлах с использованием Awk

    Как зашифровать git на моем сервере?

    Linux и Unix - лучшая ОС в мире.