печатать различное количество строк до и после шаблона

У меня есть каталог с тысячами файлов со следующим повторяющимся шаблоном, содержащим сотни разделов –

############### # Section 1 ############### some text more text some more text some text more text some more text ############### # Section 2 ############### some text more text some more text interesting-pattern some text more text some more text ############### # Section 3 ############### some text more text some more text some text more text some more text 

Что мне нужно сделать, так это выяснить способ извлечь всю СЕКУНДУ, где существует «интересный шаблон».

Я попытался сделать grep -iEr 'интересный шаблон' с флагами -A и -B, но это не работает, потому что в каждом файле может быть разное количество строк в секции до и после шаблона интерстинга.

Каков наилучший способ сделать это?

  • Как сделать OR grep (с разными настройками GREP_COLOR)
  • Могу ли я заставить grep обрабатывать экранированную многострочную линию как одну строку?
  • Grep для ближайшего появления строки перед рисунком
  • Сценарий Bash для суммирования «last -a»
  • Как grep n-я подстрока между заданными разделителями?
  • Grep -H не всегда возвращает путь к файлу, когда два совпадения находятся в одной строке
  • Разбор .txt-файла для генерации .csv
  • «Голова» печатает только одну строку?
  • One Solution collect form web for “печатать различное количество строк до и после шаблона”

    Это не работа для grep, но для лучшего инструмента, такого как awk.

    Легким обходным путем является использование gnu awk с настраиваемым разделителем данных RS, например Section .

    Используя слово «Раздел» для разделения строк, все, что находится между словами Section 1 и Section 2 будет рассматриваться как одна строка для awk.
    То же самое для раздела 2 – раздел 3 и т. Д.

    Теперь вам нужно только напечатать правильную строку «line» = «line», которая содержит interesting-pattern .

     $ awk -v RS="# Section " '/interesting-pattern/{print RT $0}' file1 # Section 2 ############### some text more text some more text interesting-pattern some text more text some more text ############### 

    Поскольку gnu awk может принимать регулярное выражение в RS (Record Separator), вы также можете применить в RS нечто более сложное:

     $ awk -v RS="###############\n# Section " '/interesting-pattern/{print RT $0}' ############### # Section 2 ############### some text more text some more text interesting-pattern some text more text some more text 

    PS: {print RT указывает awk на печать используемого в настоящее время разделителя записей

    Interesting Posts

    Выполняются ли команды через SSH прозрачно администратору удаленного хоста?

    Проблемы с установкой Dropbox в Scientific Linux

    Использование Ctrl + для переключения между окнами с помощью tmux

    Как остановить автоматический монтаж устройств в Ubuntu?

    Удаляется ли каталог, когда число жестких ссылок становится 0?

    Почему режим текстового режима медленно прокручивается?

    Измените размер определенного окна на определенный размер и местоположение экрана из сценария

    Строчные изменения в Unix

    Deadbeef не появляется в звуковом апплете Cinnamon

    Возможно ли, чтобы в журнальных файлах журнала auditd регистрировались разные правила?

    Отображения общих библиотек в / proc / pid / maps

    Разница между подоболочками и замещением процесса

    Как я могу избежать 550 «Relaying denied» с postfix?

    Dell XPS 13 9350 wifi умирает с ядрами Broadcom BCM4350 и 4.8

    Lm-Sensors: запуск определенных команд при превышении температуры выше / ниже пределов

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