Янв 112011
Скрипт для анализа времени переключения логов (парсит alert log), полезен, например, чтобы определить момент, когда началось интенсивное изменение файлов данных. Скрипт генерирует готовый CSV-файл, который можно открывать EXCEL'ем или OpenOffice Calc для дальнейшего анализа. Работающей БД, ясное дело, не требует.
Использование:
getseq.sh alert.log [-p] >> out.csv
Ключ -p запретит вывод заголовка (полезно для дальнейшего парсинга).
Вот сам скрипт:
#!/bin/bash #Cube 12.09.2010 # Сформируем заголовок, если надо if [[ $2 != "-p" ]] then echo 'Date;Sequence' fi # Запишем данные в файл. awk ' /Mon|Tue|Wed|Thu|Fri|Sat|Sun/ {d = $3 "." $2 "." $5; t = $4 } \ /advanced to log sequence/ {print d " " t ";" $7}' $1 |\ sed -e 's/Jan/01/;s/Feb/02/;s/Mar/03/;s/Apr/04/;s/May/05/;s/Jun/06/'\ -e 's/Jul/07/;s/Aug/08/;s/Sep/09/;s/Oct/10/;s/Nov/11/;s/Dec/12/'
Вот этот же скрипт на PERL:
#!/usr/bin/perl #Cube 12.01.2011 # Сформируем заголовок, если надо if (!defined($ARGV[1]) || ($ARGV[1] ne "-p")) { print "Date;Switch time;Sequence\n"; } use POSIX; my @date; my $epoch_prev = 0; my $months = {"Jan" => 0, "Feb" => 1, "Mar" => 2, "Apr" => 3, "May" => 4, "Jun" => 5, "Jul" => 6, "Aug" => 7, "Sep" => 8, "Oct" => 9, "Nov" => 10, "Dec" => 11}; open(ALERTFILE, $ARGV[0]); while(<ALERTFILE>) { # Получаем и разбиваем на поля дату if($_=~/Mon|Tue|Wed|Thu|Fri|Sat|Sun/) { @date = split(/\W+/, substr($_, 4)); } if($_=~/advanced to log sequence/) { # Нам отсюда понадобится номер sequence @words = split(/\W/, $_); # "Конструируем" из полей даты время в UNIX-формате, чтобы # было удобнее считать разницу в секундах $dt = mktime(int($date[4]), int($date[3]), int($date[2]), int($date[1]), $months->{$date[0]}, (int($date[5]) - 1900)); # Вывод результатов через ";". Заново собираем дату, чтобы # EXCEL понимал запись именно как дату. print int($date[1]), '.', $months->{$date[0]} + 1, '.', $date[5], ' ', int($date[2]), ':', int($date[3]), ':', int($date[4]), ';', $dt - $epoch_prev, ';', $words[6], "\n"; $epoch_prev = $dt; } }
Этот скрипт используется так же, как и предыдущий, но ещё считает число секунд, прошедших с момента переключения предыдущего лога.