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

У меня есть текстовый файл, который представляет собой отчет сервера, в котором содержится около 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 для неэффективных критически важных системных инструментов и задач, зная, как их читать, когда-нибудь окупится.

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

  • Отрицательные аргументы для головы / хвоста
  • Как получить разницу в уровне персонажа с помощью команды «diff» в Linux с помощью сценария оболочки?
  • Почему мой цикл inotifywait завершается после удаления некоторых подкаталогов?
  • Сравните пользователей с массивом с файлом / etc / shadow
  • скрипт, выполняющийся в crontab, не выдающий вывод на экран оболочки
  • выйти из сценария оболочки из подоболочки
  • Перемещение большого количества файлов и каталогов в другой каталог
  • Невозможно заменить переменную в скрипте оболочки с помощью awk
  • Сценарий для поиска среды рабочего стола по умолчанию?
  • Должен ли я использовать косую черту в конце переменных пути в сценарии оболочки или нет?
  • Как округлить или преобразовать значение float в int с помощью bc? получение: "(standard_in) 1: синтаксическая ошибка"
  • Linux и Unix - лучшая ОС в мире.