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

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

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

  • Как сравнить две даты в скрипте для проверки истечения срока действия
  • Редактирование файла свойств Java с помощью Bash
  • Исправить файловую оболочку
  • Как запустить скрипт с другого пути и узнать путь к скрипту?
  • Запустите сценарий оболочки перед запуском
  • Работайте с setid, чтобы открыть сеанс и закрыть его правильно.
  • Unix: C-shell: проверка дискового пространства в Hp-UX
  • Как я могу разбить буквы слова с четырьмя буквами в строке?
  • Команда Bash: возможно ли передать аргумент перед пользовательской командой (функцией) или она должна быть только после:
  • Извлечь группу пользователей при попытке подключения с помощью ssh
  • Найти каталог, если количество файлов превышает X
  • Grep строка из файла
  • Interesting Posts

    Как восстановить групповую / пользовательскую правку по умолчанию для всех файлов в / var?

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

    Могу ли я использовать символическую ссылку в качестве службы systemd?

    Перенаправление ввода с использованием команды и параметров

    Как определить время настенных часов процесса?

    Двойная загрузка системы Linux с шифрованием

    Показать текст в виде звездочек

    Установщик Debian с Backported Kernel

    как добавить эти 3 строки в качестве переменных окружения в файл .profile bash

    Перезапись парольной фразы заставляет шифровать

    Ошибка сценария загрузки chkconfig, сценарий работает хорошо вручную

    Можно ли монтировать трубку в cp?

    Ошибка класса символов в nvi: ] интерпретируется как ]

    Как печатать только одно совпадение grep, когда tail -f?

    Добавить mth и nth столбцы файла со столбцами другого файла

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