LINUX.ORG.RU

Парсер syslog на Perl


0

1

С перлом дело не имел. Пытаюсь парсить сислог на подключение съемных устройств:

#/usr/bin/perl -w

open(SYS, " < /var/log/syslog") || die "/var/log/syslog not found!";
while (<SYS>) { ($month, $day, $time, $hname, $service, $action, $device) = split(' '); }

if (service=="hald" || $action=="mounted") {
print "месяц $month\n";
print "день  $day\n";
print "время $time\n";
print "имя хоста: $hname\n";
print "демон: $service \n";
print "действие: $action\n";
print "устройство: $device\n";

#print ("Устройство $device смонтированно $day $time на хосте $hname\n\n");
}
но в итоге он выдает последнюю строку syslog'a, а мне необходимо что бы в переменные попадали записи именно из строки содержащей $service==hald.
splinter@sprogrammer:~/src/PERL$ perl sysstream.pl 
месяц Jul
день  4
время 14:17:01
имя хоста: sprogrammer
демон: CRON[19632]: 
действие: (root)
устройство: CMD
мне нужна строка:
Jul  4 14:37:01 sprogrammer hald: unmounted /dev/sdf1 from '/media/KINGSTON' on behalf of uid 1000
Или вот например
splinter@sprogrammer:~/src/PERL$ perl sysstream.pl 
месяц Jul
день  4
время 14:38:40
имя хоста: sprogrammer
демон: thunar: 
действие: Trash
устройство: directory
Вопрос: 1. Как постоянно парсить только последние к примеру 4 строки. 2. Как возвращать в переменные строки в которых $service==hald.

★★★★★

Ответ на: комментарий от anonymous

Он выдает все строки не обращая внимания на $service==hald :-(

splinter ★★★★★
() автор топика

> if (service==«hald» || $action==«mounted»)

=_='

if (service eq «hald» || $action eq «mounted»)

«==» — для сравнения чисел, а не строк…

arsi ★★★★★
()
Ответ на: комментарий от arsi
#/usr/bin/perl -w 
$x=10000;
while ($x > 0) {
open(SYS, "/var/log/syslog") || die "/var/log/syslog not found!";
#Отслеживаем монтирование:
while (<SYS>) { ($month, $day, $time, $hname, $service, $action, $device) = split(' ');

if ($service eq "hald:" || $action eq "mounted") {
print "==================MOUNTING=====================\n";
print "месяц: $month\n";
print "день: $day\n";
print "время: $time\n";
print "имя хоста: $hname\n";
print "демон: $service\n";
print "действие: $action\n";
print "Устройство $device смонтированно\n";
print "=================FILNAL MOUNTING===============\n";
}

#Отслеживание размонтирования:
if ($service eq "hald:" || $action eq "umounted") {
print "=================UMOUNTING====================\n";
print "месяц $month\n";
print "день  $day\n";
print "время $time\n";
print "имя хоста: $hname\n";
print "демон: $service \n";
print "действие: $action\n";
print "устройство: $device\n";
print ("Устройство $device размонтированно $day $time на хосте $hname\n\n");
print "================FINALL UMOUNTING==============\n";
                                                }
}
close(SYS);
$x=$x-1;
print "\nосталось: $x\n";
sleep 1;

}

В принципе так работает, подскажите как очистить экран консоли из perl? И еще на

open(SYS, "tail -4 /var/log/syslog |")
срабатывает исключение /var/log/syslog not found!

splinter ★★★★★
() автор топика
Ответ на: комментарий от arsi

и еще одна проблема:

if ($service eq "hald:" || $action eq "mounted") 
срабатывает и тогда когда $service eq «hald:» и $action eq «umounted. Что не есть гуд, необходимо какое то строгое соответсвие.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

> подскажите как очистить экран консоли из perl?

print «\e[2J\e[H»

> срабатывает исключение /var/log/syslog not found!

не факт. ошибок в мире^Wлинуксе больше, чем «ххх not found». меняй на die «/var/log/syslog: $!».

и что там за магия с $x? закат солнца^WWtail -f вручную?

arsi ★★★★★
()
Ответ на: комментарий от splinter

> срабатывает и тогда когда $service eq «hald:» и $action eq «umounted. Что не есть гуд, необходимо какое то строгое соответсвие.

ну так поставь and (&&), а не or (||).

arsi ★★★★★
()
Ответ на: комментарий от arsi

>и что там за магия с $x? закат солнца^WWtail -f вручную?

Это я так баловался что бы видеть что процесс идет :-)

ну так поставь and (&&), а не or (||).


Теперь вообще ничего кроме счетчика не показывает. :-(

splinter ★★★★★
() автор топика
Ответ на: комментарий от arsi

Теперь вообще ничего кроме счетчика не показывает. :-(


Извиняюсь, скобка улетела, vim слегка нагадил.

splinter ★★★★★
() автор топика
Ответ на: комментарий от arsi

Что то я ничего не понимаю, теперь на монтирование работает, на размонтирование не работает:

#/usr/bin/perl -w 
$x=100;
while ($x > 0) {
open(SYS, "/var/log/syslog") || die "/var/log/syslog: $!";
#Отслеживаем монтирование:
while (<SYS>) { ($month, $day, $time, $hname, $service, $action, $device) = split(' ');

if ($service eq "hald:" && $action eq "mounted") {
print "==================MOUNTING=====================\n";
print "месяц: $month\n";
print "день: $day\n";
print "время: $time\n";
print "имя хоста: $hname\n";
print "демон: $service\n";
print "действие: $action\n";
print "Устройство $device смонтированно\n";
print "=================FILNAL MOUNTING===============\n";
}

#Отслеживание размонтирования:
if ($service eq "hald:" && $action eq "umounted") {
print "=================UMOUNTING====================\n";
print "месяц $month\n";
print "день  $day\n";
print "время $time\n";
print "имя хоста: $hname\n";
print "демон: $service \n";
print "действие: $action\n";
print "устройство: $device\n";
print ("Устройство $device размонтированно $day $time на хосте $hname\n\n");
print "================FINALL UMOUNTING==============\n";
                                                }
}
close(SYS);
$x=$x-1;
print "\nосталось: $x\n";
sleep 1;


}

строки в логе:

Jul  4 16:27:51 sprogrammer hald: unmounted /dev/sdf1 from '/media/KINGSTON' on behalf of uid 1000
Jul  4 16:28:01 sprogrammer hald: mounted /dev/sdb1 on behalf of uid 1000
Jul  4 16:28:07 sprogrammer hald: mounted /dev/sdf1 on behalf of uid 1000

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

> на размонтирование не работает
> $action eq «umounted»
> hald: unmounted /dev/sdf1

угадай, какая буква пропущена ;)

кстати,

#!/usr/bin/perl

use strict;
use warnings 'all';

#open my $fh, 'tail -4 /var/log/messages |' or die $!;
open my $fh, '/var/log/messages' or die $!;
while (<$fh>) {
    print "device '$6' ${5} ($1 $2 $3 @ $4)\n"
        if /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+hald:\s+((?:un)?mounted)\s+(\S+)/;
}
arsi ★★★★★
()
Ответ на: комментарий от arsi

угадай, какая буква пропущена ;)

:-) пора в отпуск. Спасибо!

splinter ★★★★★
() автор топика
#!/bin/bash

count = $1
log = $2
tail -"$count" "$log" |
while read line 
do
        text=""
        array=( $line )
        if [ "${array[4]}" = "hald:" ]; then
                text=$text"месяц: ${array[0]}\n";
                text=$text"день: ${array[1]}\n";
                text=$text"время: ${array[2]}\n";
                text=$text"имя хоста: ${array[3]}\n";
                text=$text"демон: ${array[4]}\n";
                text=$text"действие: ${array[5]}\n";

                if [ "${array[5]}" = "mounted" ]; then
                        text="==================MOUNTING=====================\n"$text
                        text=$text"Устройство ${array[6]} смонтированно\n";
                        echo -e $text"=================FILNAL MOUNTING===============\n"
                elif [ "${array[5]}" = "mounted" ]; then
                        text="==================UMOUNTING=====================\n"$text
                        text=$text"Устройство $device размонтированно ${array[1]} ${array[2]} на хосте ${array[3]}\n\n"
                        echo -e $text"=================FILNAL UMOUNTING===============\n"
                fi
        fi
done

rg-400
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.