Как искать определенные разделы файла, а затем извлекать только соответствующую информацию в этом разделе?

У меня есть текстовый файл, который представляет собой отчет сервера, в котором содержится около 1000 строк информации. Я пытаюсь написать сценарий, который может искать отчет только для определенных фрагментов информации, которые я ищу.

Например:

Проверка работоспособности сервера 1

Дата – количество ошибок


25.06.15 : 14

6/24/15 : 21

6/23/15 : 17

6/24/15 : 33

Проверка работоспособности сервера 2

Дата – количество ошибок


25.06.1154 : 4

6/24/15 : 13

6/23/15 : 21

6/24/15 : 33

Ошибки, вызванные X


Сервер 1:

32

Сервер 2:

24

Эти три раздела

  • «Проверка работоспособности сервера 1»,
  • «Проверка работоспособности сервера 2» и
  • «Ошибки, вызванные x».

Данные из каждого раздела, которые мне нужны, выделены жирным шрифтом.

Кто-нибудь знает, как я могу это сделать?
Я знаю, что я могу использовать grep но я не могу использовать grep с флагами -A , -B и -C .

3 Solutions collect form web for “Как искать определенные разделы файла, а затем извлекать только соответствующую информацию в этом разделе?”

Как насчет скрипта sed с gotos (удар, ужас). Это может быть упрощено, если вы более точно описываете свои данные.

 sed -n ' :start /Server .* Health Check/{ n /Date - Count/n :loop1 / : /{p; n; b loop1 } b start } /Errors caused by/{ n :loop2 /Server/n /^[0-9]/{p; n; b loop2 } b start } ' 

Сценарий распознает первый стиль заголовка и входит в часть {}. Он читает следующую строку (n), и если она является заголовком Date, читает другую строку. Если строка соответствует строке стиля «:» (/: /), она входит в часть {}, которая печатает строку (p), читает следующую строку (n) и ветви (b) для метки loop1. Когда больше строк не совпадают, ветви на начало меток.

То же самое происходит при просмотре второго стиля заголовка.

Ну, если у вас есть инструменты GNU, вы можете сделать:

 for match in \ Server\ Health\ Check\ 1 Server\ Health\ Check\ 2 Errors\ caused\ by\ X do grep -Fxm1 "$match" case $match in (S*) sed -nEu '/^[0-9/:]+/!q;p';; (*) sed -u '4q;3d;1d';; esac;done <file 

Предположение здесь состоит в том, что между интересующими вас разделами имеются некоторые промежуточные данные (потому что иначе: cat ) .

Без инструментов GNU:

 grep -nxE 'Server Health Check [12]|Errors caused by X' <file | sed 's|\([^:]*\):S.*|\1,/\n.*[^0-9/:]/{\1!P?}?| s|\([^:]*\):E.*|\1{N;s/.*\\n//p;N;s///p?}?| y/?/\n/' | sed -e1!N -f- -eD ./file 

Используйте полный язык сценариев, например Perl, Python или Ruby, в соответствии с тем, с чем вы больше всего знакомы. Если нет, возможно, изучение Python даст вам больше всего шансов для доллара. Многие дистрибутивы Linux используют Python для неэффективных критически важных системных инструментов и задач, зная, как их читать, когда-нибудь окупится.

Будучи в состоянии искать, анализировать линии и очищать информацию, а также организовывать результаты в гибких, способных структурах данных, сохранит работу в этом случае и во многих подобных, чтобы следовать.

  • Удалите N строк, сохраните следующий N и т. Д.
  • Улучшение производительности скрипта
  • Обработка текста и экспорт содержимого на лист Excel
  • Как передать аргумент с пробелами функции сценария оболочки?
  • Клавиша со стрелкой / Ввод меню
  • Предсказание PID ранее начатой ​​команды SSH
  • Переименование нескольких каталогов, вставляемых между
  • Что такое безопасный и переносимый способ разделить строку в программировании оболочки?
  • Замените файл с разделителями-запятыми на канал, но не удаляйте запятую или кавычки и т. Д. В поле определения текста, однако удалите спецификатор текста!
  • Заменить значения в файле
  • Как искать и заменять текст во всех php-файлах в каталоге и в его подкаталогах
  • Interesting Posts

    Обновление Yum показывает «Killed»

    Установка драйвера беспроводной сети (realtek 8188CE) на Debian wheezy

    Получение пользовательского ввода из сценария, используемого как stdin для сеанса SSH

    Что символизирует и как я могу узнать, как это сделать?

    Почему я только получаю 100mbit на моем Asus GigaX1005?

    Как вручную удалить urllib, urllib2, запрашивает пакеты python?

    Gnome не хочет запускать

    Как использовать MEncoder для кодирования всех png-файлов (в текущем каталоге) в качестве файла avi в порядке изменения даты?

    Как отказаться от маршрутов, которые загружены сервером OpenVPN?

    Какой самый безопасный (или самый элегантный или самый короткий) способ изменить в каталог, откуда вызывается скрипт?

    Можно ли запускать несколько PHP-сайтов с помощью 1 машины?

    Является ли использование сокращенной быстрой замены расширения истории проблематичным?

    Можно ли скопировать изменения ядра на новый компьютер?

    Задавать групповые разрешения как разрешения владельца

    OpenVPN с / 112 подсети IPv6, неспособный перенаправить на eth0 и наоборот

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