Янв 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;
        }
}

Этот скрипт используется так же, как и предыдущий, но ещё считает число секунд, прошедших с момента переключения предыдущего лога.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)