Добрый день!
Помогите, подскажите как написать следующий скрипт. Я в Perl'е новичек.

Имеем: Сервер Ubuntu 12.04, как шлюз интернет. На нем - Сервер DHCP, Прокси-сервер Squid, SquidGuard и SARG. Пользователи ходят в инет без всяких авторизаций. SARG генерит отчеты, кто и куда ходил. Но вместо имен компьютеров в отчете IP адреса. SARG умеет разрешать имена хостов из адресов, но для этого ему надо файл формата IP:host_name.

Теперь собственно вопрос... На просторах данного сайта нашел варианты в теме Не слишком ли громоздко? Второй вариант что смог доработал, убрал вывод ненужных данных о дате лизинга адреса, но теперь не могу понять как реализовать запись этого дела в файл и исключение повторяющихся записей. Прошу помощи.

#!/usr/bin/perl
open(InFile, "/var/lib/dhcp/dhcpd.leases") || die;
while ($line = <InFile>)
{
($n1, $n2, $n3, $n4) = split (" ", $line);
        if ($n1 eq "lease")
        {
        $ip=$n2;
        }
        if ($n1 eq "starts")
        {
        $sdate=$n3;
        }
        if ($n1 eq "ends")
        {
        $edate=$n3;
        }
        if ($n1 eq "hardware")
        {
        $mak=$n3;
        }
        if ($n2 eq "ddns-fwd-name")
        {
        $name=$n4;
        }

if ($ip gt "" & $sdate gt "" & $edate gt "" & $mak gt "" & $name gt "")
{
chop ($mak);
chop ($name);
$lenname = length ($name);
$n = substr ($name, "1" , $len-2);
print $ip , " ", $sdate, " ", $edate, " ", $mak, " ", $n, " ", "\n";
$sdate="";
$edate="";
$mak="";
$name="";
$n="";
$lenname="";
}
}
close ( InFile );

За ранее спасибо.

2 (21.10.2013 16:48:48 отредактировано -=Serj=-)

$ ./script.pl >> out.txt

Если по-простому.
UPD.

Ромашов Дмитрий пишет:

исключение повторяющихся записей

А, этот момент упустил...

Да, у меня Ubuntu.
Нет, не глючит.
-=Serj=- пишет:
$ ./script.pl >> out.txt

Если по-простому.
UPD.

Ромашов Дмитрий пишет:

исключение повторяющихся записей

А, этот момент упустил...

Это просто. И есть один недостаток, он дописывает массив в конец файла.

4

Ромашов Дмитрий, в вашем случае, как мне кажется, можно обойтись sed'ом.

Да, у меня Ubuntu.
Нет, не глючит.

5 (21.10.2013 17:03:55 отредактировано Ромашов Дмитрий)

-=Serj=- пишет:

Ромашов Дмитрий, в вашем случае, как мне кажется, можно обойтись sed'ом.

Хм... Наверно... Это всего лишь попытка доработать решение, которое есть... Покопаю sed

UDP
Казалось, что есть рабочий вариант и его немного нужно "допилить"...

6

Ромашов Дмитрий пишет:

Казалось, что есть рабочий вариант и его немного нужно "допилить"...

Ну, если вы знаете perl.. Я его не знаю)

Да, у меня Ubuntu.
Нет, не глючит.

7 (21.10.2013 17:36:03 отредактировано Ромашов Дмитрий)

-=Serj=- пишет:
Ромашов Дмитрий пишет:

Казалось, что есть рабочий вариант и его немного нужно "допилить"...

Ну, если вы знаете perl.. Я его не знаю)

А если советуете sed, то может не нем что-то сгенерите?) Для затравки)

UDP
Кстати, если делать так

$ ./script.pl > out.txt

, а не

$ ./script.pl >> out.txt

то файл перезаписывается, а не дописывается вроде...

8 (22.10.2013 10:58:19 отредактировано Kettler)

очень на быструю руку

#!/usr/bin/perl
$test = "0";
open(InFile, "/home/user/in.bd") || die;
open(OutFile, ">/home/user/out.bd") || die;

while ($line = <InFile>)
{
($n1, $n2, $n3, $n4) = split (" ", $line);
        if ($n1 eq "lease")
        {
        $ip=$n2;
        }
        if ($n1 eq "starts")
        {
        $sdate=$n3;
        }
        if ($n1 eq "ends")
        {
        $edate=$n3;
        }
        if ($n1 eq "hardware")
        {
        $mak=$n3;
        }
        if ($n2 eq "ddns-fwd-name")
        {
        $name=$n4;
        }

if ($ip gt "" & $sdate gt "" & $edate gt "" & $mak gt "" & $name gt "")
{
chop ($mak);
chop ($name);
$lenname = length ($name);
$n = substr ($name, "1" , $len-2);
$test++;
$line = "$ip $sdate $edate $mak $n \n";
@data[$test] = ($line);

$sdate="";
$edate="";
$mak="";
$name="";
$n="";
$lenname="";
}
}
close ( InFile );

foreach $item (@data)
{
$seen{$item}++;
}
@uniq = sort keys %seen;

foreach $lline (@uniq)
{
print OutFile $lline ;
}
close (OutFile);
Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

9 (23.10.2013 11:35:09 отредактировано Ромашов Дмитрий)

Kettler пишет:

очень на быструю руку

+ открыть спойлер
#!/usr/bin/perl
$test = "0";
open(InFile, "/home/user/in.bd") || die;
open(OutFile, ">/home/user/out.bd") || die;

while ($line = <InFile>)
{
($n1, $n2, $n3, $n4) = split (" ", $line);
        if ($n1 eq "lease")
        {
        $ip=$n2;
        }
        if ($n1 eq "starts")
        {
        $sdate=$n3;
        }
        if ($n1 eq "ends")
        {
        $edate=$n3;
        }
        if ($n1 eq "hardware")
        {
        $mak=$n3;
        }
        if ($n2 eq "ddns-fwd-name")
        {
        $name=$n4;
        }

if ($ip gt "" & $sdate gt "" & $edate gt "" & $mak gt "" & $name gt "")
{
chop ($mak);
chop ($name);
$lenname = length ($name);
$n = substr ($name, "1" , $len-2);
$test++;
$line = "$ip $sdate $edate $mak $n \n";
@data[$test] = ($line);

$sdate="";
$edate="";
$mak="";
$name="";
$n="";
$lenname="";
}
}
close ( InFile );

foreach $item (@data)
{
$seen{$item}++;
}
@uniq = sort keys %seen;

foreach $lline (@uniq)
{
print OutFile $lline ;
}
close (OutFile);

Спасибо за желание помочь!)
OutFile пустой... Пытаюсь разобраться...

UDP Разобрался, допилил. Результат вот.

+ открыть спойлер

#!/usr/bin/perl
$test = "0";
open(InFile, "/var/lib/dhcp/dhcpd.leases") || die;
open(OutFile, ">/etc/sarg/usertab") || die;

while ($line = <InFile>)
{
($n1, $n2, $n3, $n4) = split (" ", $line);
        if ($n1 eq "lease")
        {
        $ip=$n2;
        }
        if ($n1 eq "starts")
        {
        $sdate=$n3;
        }
        if ($n1 eq "ends")
        {
        $edate=$n3;
        }
        if ($n1 eq "hardware")
        {
        $mak=$n3;
        }
        if ($n1 eq "client-hostname")
        {
        $name=$n2;
        }

if ($ip gt "" & $sdate gt "" & $edate gt "" & $mak gt "" & $name gt "")
{
chop ($mak);
chop ($name);
$lenname = length ($name);
$n = substr ($name, "1" , $len-1);
$test++;
$line = "$ip $n \n";
@data[$test] = ($line);

$sdate="";
$edate="";
$mak="";
$name="";
$n="";
$lenname="";
}
}
close ( InFile );

foreach $item (@data)
{
$seen{$item}++;
}
@uniq = sort keys %seen;

foreach $lline (@uniq)
{
print OutFile $lline ;
}
close (OutFile);

Вариант польностью рабочий для SARG'а. Может кому пригодится.
Большое спасибо!!!