Intereting Posts
найти и удалить файлы размером более определенного размера и типа Нужна дополнительная информация о уведомлении о работе KDE Что вы называете соглашением о вызовах `int 0x80`? выберите папку на хосте с пользователем, который существует только в контейнере dockerа Симлинку или нет Симлинку? Обновление с Ubuntu 16.04 до 18.04.1: зачем мне ждать несколько дней? Launcher поверх X11 в качестве оконного менеджера Где CONFIG_COMPAT_VDSO в make menuconfig? Фильтровать файл csv на основе расширенных значений столбца Как получить разницу между двумя метками времени? Автоматическая установка зашифрованной домашней папки из предыдущей установки Где, кроме $ HOME, если где-нибудь, могут быть найдены определенные конфиги аккаунта? проверка статуса sendmail как пользователя NON root редактирование очень длинной строки, много столбцов в vim Исходный код ядра: что такое parent_tidptr и child_tidptr в do_fork ()?

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

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

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

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

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

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