Intereting Posts
Как сделать локальные сертификаты CA системы известными для Firefox? Перемещение случайных файлов с использованием shuf и mv – список аргументов слишком длинный Установка переменных среды для пользователей системы При каких обстоятельствах pgrep -x не может вернуть действительный pid? Я убил sshd, но он все еще работает? Массовое переименование, изменение суффикса? Есть ли способ заблокировать запуск программы в определенные моменты? Открытый LDAP предназначен для работы с командой passwd для Linux? Плагин munin phpfpm Как дождаться / dev / video0 перед запуском службы назначать и проверять метаданные функции bash Как добавить автозаполнение для «драгоценного камня», которое с помощью rbenv? Ограничение пользователя SFTP только в их домашнем каталоге Восстановите Windows 8 после установки Kali Linux (GRUB) Сокращение тайм-аута выключения для «остановки работы»

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

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

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

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