Thread View: pl.comp.lang.perl
19 messages
19 total messages
Started by gregor
Fri, 03 Dec 2010 17:58
problem logiczny ze skryptem
Author: gregor
Date: Fri, 03 Dec 2010 17:58
Date: Fri, 03 Dec 2010 17:58
64 lines
2119 bytes
2119 bytes
Witam
Napisalem skrypt wyciagajacy z mailloga informacje o danym koncie email
tzn. kiedy sie logowal
i jaka byla sciezka mail queue (tzn. skad i dokad byl wysylany mejl)
#!/usr/bin/perl
$REGEXP = shift || die "nie podano adresu email / domeny";
$dir = '/usr/skrypty/maillog/boborowa';
@data = `/bin/cat $dir/maillog`;
my %Q;
my %line;
for (@data)
{
if (/$REGEXP/i)
{
if (/([0-9A-Z]{10})/)
{
$queue_id = $1;
}
if ($queue_id)
{
$Q{$queue_id} = 1;
}
if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
{
$line{$_} = $1;
}
$queue_id = "";
}
}
# tu robie grep jeszcze raz dla maillog z konkretym ID queue i dopisuje
do lini
foreach (keys %Q)
{
@data = `/bin/cat $dir/maillog | grep $_`;
foreach (@data)
{
if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
{
$line{$_} = $1;
}
}
}
# wyswietlam posortowane wpisy na podstawie godziny
# tu pojawia sie problem bo jak sortuje po godzinach to
# gubi sie kolejnosc wpisow
foreach my $id (sort keys %line)
{
print $id;
}
no i pytanko jak to rozwiazac inaczej, moze ktos pisal skrypt na tego
typu potrzeby
dzieki
gregor
Re: problem logiczny ze skryptem
Author: MaW
Date: Fri, 03 Dec 2010 18:13
Date: Fri, 03 Dec 2010 18:13
31 lines
2223 bytes
2223 bytes
Użytkownik "gregor" <gregor@szu.pl> napisał w wiadomości news:idbb3m$dpe$1@inews.gazeta.pl... > Witam > > Napisalem skrypt wyciagajacy z mailloga informacje o danym koncie email > > tzn. kiedy sie logowal > i jaka byla sciezka mail queue (tzn. skad i dokad byl wysylany mejl) > Nie bardzo rozumiem dwukrotnego grepowania. W sendmailu zrobiłbym to tak: dla maili wychodzących grepujesz raz, w pętli robisz dwie rzeczy: Sprawdzasz czy jest to "From:", jesli tak to sprawdzasz nadawce i jesli pasuje to zapamiętujesz w haszu: klucz to message-id, wartość dowolna Jesli to jest linia zaczynająca sie od "to: " - pobierasz message-id i sprawdzasz czy istnieje w haszu klucz o takim message-id, jesli tak to wypisujesz from, to message-id, data, i kasujesz z hasza klucz message_id: Algorytm bazuje na tym, że każdemu emailowi towarzyszą 2 linie - pierwsza o nadejsciu maila i wpadnieciu do kolejki, druga o dostarczeniu. Na koncu wypisujesz hasza - będzie zawierał tylko maile niedostarczone Jesli chcesz miec maile w drugą strone - w petli dodatkowo użyj drugiego hasza dla maili przychodzących Ale bedziesz musiał zapamiętywac każdego maila przychodzącego, Jeśli jednak zostanie dostarczony na inne lokalne konto - tylko skasujesz z hasza. Jeśli na interesujące - wypiszesz i skasujesz. MaW
Re: problem logiczny ze skryptem
Author: Kacper Perschke
Date: Fri, 03 Dec 2010 23:42
Date: Fri, 03 Dec 2010 23:42
21 lines
1474 bytes
1474 bytes
Dnia 03.12.2010 gregor <gregor@szu.pl> napisał: > [...] > Napisalem skrypt wyciagajacy z mailloga [...] Dość luźne uwagi. 1) Domyślam się, że '/usr/skrypty/maillog/boborowa/maillog' to pojedynczy plik. Więc zamiast korzystać z shellowych cat i grep wczytaj cały plik do perla, a następnie przegrepuj w perlu. 2) foreach nie gwarantuje, że będzie szedł po liście w kolejności indeksu. > no i pytanko jak to rozwiazac inaczej, moze ktos pisal skrypt na tego typu > potrzeby IMHO napisać to mniej enigmatycznie (z chęcią pomogę). Ja w ciągu 3 minut nie byłem w stanie załapać z kodu algorytmu i zrezygnowałem. KAcper -- Mail => www.rot13.com
Re: problem logiczny ze skryptem
Author: hubert depesz lubaczewski
Date: Sat, 04 Dec 2010 09:44
Date: Sat, 04 Dec 2010 09:44
12 lines
1205 bytes
1205 bytes
On 2010-12-03, gregor <gregor@szu.pl> wrote: > Napisalem skrypt wyciagajacy z mailloga informacje o danym koncie email > tzn. kiedy sie logowal > i jaka byla sciezka mail queue (tzn. skad i dokad byl wysylany mejl) hmm .. czy to może jest log exima? depesz -- Linkedin: http://www.linkedin.com/in/depesz / blog: http://www.depesz.com/ jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: problem logiczny ze skryptem
Author: Adam Osuchowski
Date: Sun, 05 Dec 2010 12:39
Date: Sun, 05 Dec 2010 12:39
17 lines
1720 bytes
1720 bytes
Kacper Perschke wrote: > 2) foreach nie gwarantuje, że będzie szedł po liście w kolejności indeksu. Jest to gdzieś powiedziane wprost w dokumentacji czy wnioskujesz po tym, że nie jest powiedziane, że gwarantuje? Szczerze powiedziawszy jestem tym trochę zaskoczony bo zawsze zakładam, że foreach iteruje w kolejności indeksów i się nie spotkałem z przypadkiem, żebym się na tym zawiódł. W sekcji ,,Foreach Loops'' manuala perlsyn nie ma wprawdzie tego jasno powiedzianego, ale IMHO na zdrowy rozsądek, gdyby kolejność nie była gwarantowana, to byłoby to jasno zaznaczone, gdyż logicznym jest, że foreach powinien iterować po kolei i wielu programistów mogłoby się na tym wyłożyć. W tej samej sekcji jest natomiast przykład a'la C (for ze zmienną iteracyjną) zestawiony jako tożsamy z foreach, co sugeruje, że jednak foreach idzie w kolejności indeksu.
Re: problem logiczny ze skryptem
Author: gregor
Date: Sun, 05 Dec 2010 13:32
Date: Sun, 05 Dec 2010 13:32
89 lines
2975 bytes
2975 bytes
pisze jeszcze raz zmodyfikowalem nieco swoj skrypt ale "wisze" w jednym
miejscu wlasnie w greepie bo musze jeszcze raz ten sam plik przeleciec
greepem tak by powiazac ID kolejki z logami
to jest maillog - moze nie potrzebnie sie mecze i wogole jest juz taki
skrypt co wyciaga wszelkie logi usera z mailloga samo danie cat /maillog
| grep "adres@email" - nie dziala jak nalezy, dlatego pisalem ten skrypt
ale dziala zbyt wolno
#!/usr/bin/perl
$dir = '/usr/skrypty/maillog/boborowa/logi';
$skrzynka = '';
my %Q;
my %line;
my %skrzynki = (
'biuro@xxx.pl' => 1,
);
# mam do obrobienia ok 300 plikow mailloga
for ($i=309;$i>=31;$i--)
{
open(UCHWYT, "$dir/maillog.$i");
while (<UCHWYT>)
{
#sprawdzam czy wpis jest emailem jesli tak to wchodzi dalej i sprawdza w
haszu czy jest email jesli tak obrabia go dalej i tworzy linie
if
(/([\w\.-]*[a-zA-Z0-9_]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/)
{
if ($skrzynki{$1})
{
if(!$skrzynka)
{
$skrzynka = $1;
}
if (/([0-9A-Z]{10})/)
{
$Q{$1} = 1;
}
if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
{
$line{$_} = $1;
}
$queue_id = "";
}
}
}
close UCHWYT;
# tu robie grep jeszcze raz dla maillog z konkretym ID queue i dopisuje
#do lini i tu mam problem bo nie dziala mi odwolywanie sie do uchwytu
#np. robie
# $quee_id = $_;
# @data = grep {/$quee_id/i} <UCHWYT>;
foreach (keys %Q)
{
@data = `/bin/cat $dir/maillog.$i | grep $_`;
foreach (@data)
{
if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
{
$line{$_} = $1;
}
}
}
}
# wyswietlam posortowane wpisy na podstawie godziny
# tu pojawia sie problem bo jak sortuje po godzinach to
# gubi sie kolejnosc wpisow
open ZAPISZ, "+>>$dir/wynik/$skrzynka";
foreach my $line (sort keys %line)
{
print ZAPISZ $line;
}
close ZAPISZ;
dzieki za pomoc
gregor
Re: problem logiczny ze skryptem
Author: gregor
Date: Sun, 05 Dec 2010 17:26
Date: Sun, 05 Dec 2010 17:26
76 lines
2601 bytes
2601 bytes
OK jakos tam sobie poradzilem jak na moje umiejetenosci
moze sie komusc przyda chodzi przyzwoicie i ladnie zczytuje logi z postfixa
#!/usr/bin/perl
$dir = '/usr/skrypty/maillog/boborowa/logi';
#`/bin/rm -f $dir/wynik/*`;
#31 maillog
my %skrzynki = (
'biuro@xxx.pl' => 1,
'marketing@xxx.pl' => 1,
);
foreach my $sprawdz (keys %skrzynki)
{
open ZAPISZ, "+>>$dir/wynik/$sprawdz";
for ($i=309;$i>=31;$i--)
{
open(UCHWYT, "$dir/maillog.$i");
open(UCHWYT_copy, "$dir/maillog.$i");
@UCHWYT = <UCHWYT_copy>;
my %Q;
my %line;
while (<UCHWYT>)
{
#sprawdzam czy wpis jest emailem jesli tak to wchodzi dalej i sprawdza w
haszu czy jest email jesli tak obrabia go dalej i tworzy linie
if
(/([\w\.-]*[a-zA-Z0-9_]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/)
{
if ($skrzynki{$1} && $sprawdz eq $1)
{
if (/([0-9A-Z]{10})/)
{
$Q{$1} = 1;
}
if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
{
$line{$_} = $1;
}
$queue_id = "";
}
}
}
close UCHWYT;
# tu robie grep jeszcze raz dla maillog z konkretym ID queue i dopisuje
do lini
foreach (keys %Q)
{
$id = $_;
foreach (grep (/$id/, @UCHWYT))
{
print $_;
if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
{
$line{$_} = $1;
}
}
}
# wyswietlam posortowane wpisy na podstawie godziny
# tu pojawia sie problem bo jak sortuje po godzinach to
# gubi sie kolejnosc wpisow
foreach my $line (sort keys %line)
{
print ZAPISZ $line;
}
close UCHWYT_copy;
}
close ZAPISZ;
}
Re: problem logiczny ze skryptem
Author: Maciej Misiak
Date: Mon, 06 Dec 2010 19:32
Date: Mon, 06 Dec 2010 19:32
26 lines
2214 bytes
2214 bytes
W dniu 2010-12-05 13:39, Adam Osuchowski pisze: > Kacper Perschke wrote: >> 2) foreach nie gwarantuje, że będzie szedł po liście w kolejności indeksu. > > Jest to gdzieś powiedziane wprost w dokumentacji czy wnioskujesz po tym, > że nie jest powiedziane, że gwarantuje? Szczerze powiedziawszy jestem tym > trochę zaskoczony bo zawsze zakładam, że foreach iteruje w kolejności > indeksów i się nie spotkałem z przypadkiem, żebym się na tym zawiódł. > > W sekcji ,,Foreach Loops'' manuala perlsyn nie ma wprawdzie tego jasno > powiedzianego, ale IMHO na zdrowy rozsądek, gdyby kolejność nie była > gwarantowana, to byłoby to jasno zaznaczone, gdyż logicznym jest, że > foreach powinien iterować po kolei i wielu programistów mogłoby się na > tym wyłożyć. > > W tej samej sekcji jest natomiast przykład a'la C (for ze zmienną iteracyjną) > zestawiony jako tożsamy z foreach, co sugeruje, że jednak foreach idzie > w kolejności indeksu. Z reguły się to mówi przy iterowaniu po kluczach albo wartościach hasha, więc pewnie Kacprowi chodziło o tą linijkę: foreach (keys %Q) -- grizzley
Re: problem logiczny ze skryptem
Author: Maciej Misiak
Date: Mon, 06 Dec 2010 20:10
Date: Mon, 06 Dec 2010 20:10
82 lines
3531 bytes
3531 bytes
Kilka uwag:
1. nie dostrzegam sensu dwa razy otwierania i czytania pliku do
"$dir/maillog.$i". Jeśli tylko z niego czytasz i potem wykorzystujesz te
dane na zasadzie read-only to wystarczy wczytać raz i skorzystać dwa razy.
2. dla lepszej czytelności można trochę pozmieniać kolejność żeby lepiej
widoczne były bloki: otwórz plik, przeczytaj, zamknij plik
3. znaczenia pętli for ($i=309;$i>=31;$i--) nie rozumiem, więc pozostaje
tylko przypuszczać: czytanie pliku "$dir/maillog.$i" wyciągnij przed tą
pętlę. Po co 309-31 razy go wczytujesz? I x2, bo dla dwóch skrzynek?
4. w regexpie [a-zA-Z0-9_] możesz zamienić na \w. Generalnie do
sprawdzania czy string jest emailem lepiej użyj jakiegoś gotowego
Regexp::Common czy czegoś podobnego.
5. jeżeli /([0-9:]{3}[0-9:]{3}[0-9]{2})/ to jest regexp sprawdzający czy
string jest godziną, to definitywnie wypadałoby zamienić na coś, co nie
dopasuje '::::::01' ani '00000000'... Np. /(\d{2}:\d{2}:\d{2})/
6. if(w1) { if(w2) { } } lepiej zapisać jako if (w1 && w2) { }
Więc jakoś tak (bez testowania)
#!/usr/bin/perl
$dir = '/usr/skrypty/maillog/boborowa/logi';
#`/bin/rm -f $dir/wynik/*`;
#31 maillog
my %skrzynki = (
'biuro@xxx.pl' => 1,
'marketing@xxx.pl' => 1,
);
open(UCHWYT, "$dir/maillog.$i");
@UCHWYT = <UCHWYT>;
close UCHWYT;
foreach my $sprawdz (keys %skrzynki)
{
open ZAPISZ, "+>>$dir/wynik/$sprawdz";
for ($i=309;$i>=31;$i--)
{
my @Q;
my %line;
for (@UCHWYT)
{
#sprawdzam czy wpis jest emailem jesli tak to wchodzi dalej i sprawdza
w haszu czy jest email jesli tak obrabia go dalej i tworzy linie
if(/([\w\.-]*\w@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/
&& $skrzynki{$1}
&& $sprawdz eq $1)
{
if (/([0-9A-Z]{10})/)
{ push @Q = $1 }
if (/(\d{2}:\d{2}:\d{2})/)
{ $line{$_} = $1 }
$queue_id = "";
}
}
# tu robie grep jeszcze raz dla maillog z konkretym ID queue i
dopisuje do lini
for my $id(@Q)
{
for (grep /$id/, @UCHWYT)
{
print;
if (/(\d{2}:\d{2}:\d{2})/)
{ $line{$_} = $1 }
}
}
# wyswietlam posortowane wpisy na podstawie godziny
# tu pojawia sie problem bo jak sortuje po godzinach to
# gubi sie kolejnosc wpisow
print ZAPISZ sort keys %line;
}
close ZAPISZ;
}
--
grizzley
Re: problem logiczny ze skryptem
Author: Mirosław Zalewski
Date: Mon, 06 Dec 2010 20:33
Date: Mon, 06 Dec 2010 20:33
13 lines
1510 bytes
1510 bytes
grudzień roku pamiętnego 2010, prawdopodobnie 06. Wielka mądrość na
czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Maciej Misiak:
> 3. znaczenia pętli for ($i=309;$i>=31;$i--) nie rozumiem, więc
> pozostaje tylko przypuszczać: czytanie pliku "$dir/maillog.$i"
> wyciągnij przed tą pętlę. Po co 309-31 razy go wczytujesz? I x2, bo
> dla dwóch skrzynek?
Przecież to są ewidentnie pliki $dir/maillog.309, $dir/maillog.308 i
tak dalej do $dir/maillog.31. Pewnie po jakimś logrotate tyle ich jest.
--
Niżej podpisany, zamieszkały w http://minio.xt.pl ,
Mirosław Zalewski
Re: problem logiczny ze skryptem
Author: Maciej Misiak
Date: Mon, 06 Dec 2010 20:40
Date: Mon, 06 Dec 2010 20:40
16 lines
1755 bytes
1755 bytes
W dniu 2010-12-06 21:33, Mirosław Zalewski pisze: > grudzień roku pamiętnego 2010, prawdopodobnie 06. Wielka mądrość na > czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Maciej Misiak: > >> 3. znaczenia pętli for ($i=309;$i>=31;$i--) nie rozumiem, więc >> pozostaje tylko przypuszczać: czytanie pliku "$dir/maillog.$i" >> wyciągnij przed tą pętlę. Po co 309-31 razy go wczytujesz? I x2, bo >> dla dwóch skrzynek? > > Przecież to są ewidentnie pliki $dir/maillog.309, $dir/maillog.308 i > tak dalej do $dir/maillog.31. Pewnie po jakimś logrotate tyle ich jest. A ok, no to cofam idiotyczny pomysł wyciągania przed pętlę :) -- grizzley
Re: problem logiczny ze skryptem
Author: Szymon Sokół
Date: Mon, 06 Dec 2010 21:25
Date: Mon, 06 Dec 2010 21:25
91 lines
4186 bytes
4186 bytes
On Mon, 06 Dec 2010 21:10:18 +0100, Maciej Misiak wrote:
> 3. znaczenia pętli for ($i=309;$i>=31;$i--) nie rozumiem, więc pozostaje
> tylko przypuszczać: czytanie pliku "$dir/maillog.$i" wyciągnij przed tą
> pętlę. Po co 309-31 razy go wczytujesz? I x2, bo dla dwóch skrzynek?
Ej, skup się. On nie czyta tego samego pliku, tylko pliki o nazwach
maillog.309, maillog.308, i tak dalej aż do maillog.31.
Dlaczego akurat takie nazwy plików? A to już jego słodka tajemnica. Jeśli
nie chodzi o to, żeby z premedytacją pominąć nazwy spoza tego zakresu, to
prościej byłoby pewnie zrobić tak:
for my $nazwa (glob "$dir/mailbox.*") {
open UCHWYT, $nazwa;
itd.
Oczywiście ten program jest napisany tak koszmarnie, że podobnie jak Kacper
miałem problem ze zrozumieniem, co on właściwie robi, ale zgaduję, że chodzi
o wyszukanie w logach wszystkich linii, które odnoszą się do poczty od/do
danego użytkownika - czyli najpierw znajdujemy linie z danym adresem e-mail,
a potem wszystkie linie z takim samym queue id, jak te znalezione wcześniej.
Co oznacza, że można to zapisać znacznie zgrabniej, na dwa sposoby, z czego
przedstawiam tu tylko jeden, który wymaga dwukrotnego przeczytania logów,
ale jest oszczędniejszy z punktu widzenia pamięci niż drugi, który w
pierwszej kolejności wczytuje logi *w całości* do pamięci.
To byłoby jakoś tak:
#!/usr/bin/perl
use warnings;
use strict;
my $logi = '/var/log/mail.*';
my $output = '/var/log/wynik';
my @skrzynki = ('biuro@xxx.pl', 'marketing@xxx.pl');
my $regexp = join '|', map "\Q$_\E", @skrzynki;
my %qid;
# pierwszy przebieg
for my $nazwa (glob $logi) {
# jak się nie da otworzyć, pomijamy plik cichcem
open UCHWYT, '<', $nazwa or next;
while(<UCHWYT>) {
if($_ =~ /(?:from|to)=<($regexp)>/o) {
# znaleziono jeden z szukanych adresów
my $adres = $1;
# ustalamy queue-id
if(m/:\s([0-9A-F]{10}):\s/) {
# mapujemy queue-id na adres
$qid{$1} = $adres;
}
}
}
close UCHWYT;
}
# otwieramy sobie pliki wyjściowe
my %uchwyt;
for my $adres (@skrzynki) {
# ale jak się nie da zapisywać, to pora umierać
open $uchwyt{$adres}, '>', "$output/$adres" or die;
}
# drugi przebieg
for my $nazwa (glob $logi) {
open UCHWYT, $nazwa or next;
while(<UCHWYT>) {
if(m/:\s([0-9A-F]{10}):\s/ && $qid{$1}) {
# linia zawiera jeden z szukanych queue-id
# wypiszemy ją do właściwego pliku
print {$uchwyt{$qid{$1}}} $_;
}
}
close UCHWYT;
}
# zamykamy pliki wyjściowe
for my $adres (@skrzynki) {
close $uchwyt{$adres};
}
exit 0;
(tak, mam pilną robotę, zupełnie niezwiązaną z Perlem, a bo co?)
--
Szymon Sokół (SS316-RIPE) -- Network Manager B
Computer Center, AGH - University of Science and Technology, Cracow, Poland O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F
Free speech includes the right not to listen, if not interested -- Heinlein H
Re: problem logiczny ze skryptem
Author: Szymon Sokół
Date: Mon, 06 Dec 2010 21:33
Date: Mon, 06 Dec 2010 21:33
26 lines
2007 bytes
2007 bytes
On Mon, 6 Dec 2010 22:25:54 +0100, Szymon Sokół wrote:
Po chwili namysłu - ten kawałek:
> if($_ =~ /(?:from|to)=<($regexp)>/o) {
> # znaleziono jeden z szukanych adresów
> my $adres = $1;
> # ustalamy queue-id
> if(m/:\s([0-9A-F]{10}):\s/) {
> # mapujemy queue-id na adres
> $qid{$1} = $adres;
> }
> }
przecież można zoptymalizować:
if(m/:\s([0-9A-F]{10}):\s.*(?:from|to)=<($regexp)>/o) {
# znaleziono jeden z szukanych adresów
$qid{$1} = $2;
}
--
Szymon Sokół (SS316-RIPE) -- Network Manager B
Computer Center, AGH - University of Science and Technology, Cracow, Poland O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F
Free speech includes the right not to listen, if not interested -- Heinlein H
Re: problem logiczny ze skryptem
Author: Kacper Perschke
Date: Mon, 06 Dec 2010 22:11
Date: Mon, 06 Dec 2010 22:11
90 lines
3598 bytes
3598 bytes
Dnia 05.12.2010 gregor <gregor@szu.pl> napisał:
> OK jakos tam sobie poradzilem jak na moje umiejetenosci moze sie komusc
> przyda chodzi przyzwoicie i ladnie zczytuje logi z postfixa
Brawo!
Jednka podobnie jak koledzy bym go dość mocno przerobił. Co ty na propozycję
wspólnego przerobienia? Jednak wtedy wolałbym zobaczyś kawałek takiego logu
i jeszcza raz usłyszeć algorytm nie w perlu tylko słowami w języku polskim.
- Na przykład - początek
Poniżej warunek '$skrzynki{$1} && $sprawdz eq $1' jest równoważny '$sprawdz eq $1'.
foreach my $sprawdz ( keys %skrzynki ) {
if (/regexp/) {
if( $skrzynki{$1} && $sprawdz eq $1 ){
}
}
}
- Na przykład - koniec
Postarałem się trochę go uładzić, ale mi się nie podoba co wyszło. Ja dalej w
tym nie widzę idei. Gdybym dostał taki kod po kimś to bym klął autora na czym
świat stoi. Koszt wejścia to minimum ze 45 minut.
- Kod - początek
#!/usr/bin/perl
my @office_emails = ( 'biuro@xxx.pl', 'marketing@xxx.pl', );
my $working_dir = '/usr/skrypty/maillog/boborowa/logi';
my $logs = read_logs();
foreach my $checked_email (@office_emails) {
open ZAPISZ, "+>>$working_dir/wynik/$checked_email";
for my $log_content (@$logs) {
my %Q = ();
my %line = ();
for my $log_line (@$log_content) {
if ( $log_line =~
m/([\w\.-]*[a-zA-Z0-9_]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/
)
{
my $suspected_email = $1;
if ( $suspected_email eq $checked_email ) {
$Q{$suspected_email} = 1
if (/([0-9A-Z]{10})/);
$line{$log_line} = $suspected_email
if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/);
}
}
}
foreach my $id ( keys %Q ) {
foreach my $sthg_terefere ( grep ( /$id/, @$log_content ) ) {
print $id; # Debugging ???
if ( $sthg_terefere =~ m/([0-9:]{3}[0-9:]{3}[0-9]{2})/ ) {
$line{$id} = $1;
}
}
}
foreach my $line ( sort keys %line ) {
print ZAPISZ $line;
}
}
close ZAPISZ;
}
sub read_logs () {
my $logs = [];
for ( my $log_no = 309 ; $log_no >= 31 ; $log_no-- ) {
my $log_file_name = "$working_dir/maillog.$log_no";
open( LOG_FILE, $log_file_name );
my @log_file_content = <LOG_FILE>
or die "Syplem sie na czytaniu logu $log_file_name";
close(LOG_FILE);
push @$logs \@log_file_content;
}
return $logs;
}
- Kod - koniec
KAcper
--
Mail => www.rot13.com
Re: problem logiczny ze skryptem
Author: Kacper Perschke
Date: Mon, 06 Dec 2010 22:16
Date: Mon, 06 Dec 2010 22:16
21 lines
1696 bytes
1696 bytes
Dnia 05.12.2010 Adam Osuchowski <someone@somewhere.com> napisał: >> 2) foreach nie gwarantuje, że będzie szedł po liście w kolejności indeksu. Przepraszam za wprowadzanie w błąd! > Jest to gdzieś powiedziane wprost w dokumentacji czy wnioskujesz po tym, > że nie jest powiedziane, że gwarantuje? Wnioskuję po tym że nie jest powiedziane wprost iż gwarantuje. > Szczerze powiedziawszy jestem tym trochę zaskoczony bo zawsze zakładam, że > foreach iteruje w kolejności indeksów i się nie spotkałem z przypadkiem, > żebym się na tym zawiódł. Ja w sumie też nigdy się nie zawiodłem. Jak zaugerował Maciek Misiak keys(%hash) ma prawo zwracać w dowolnej kolejności więc dmuchałem na zimne. Choć ja dalej wolę pozostać przy moim dmuchaniu na zimne. KAcper -- Mail => www.rot13.com
Re: problem logiczny ze skryptem
Author: Kacper Perschke
Date: Mon, 06 Dec 2010 22:22
Date: Mon, 06 Dec 2010 22:22
17 lines
1395 bytes
1395 bytes
Dnia 06.12.2010 Szymon Sokół <szymon@bastard.operator.from.hell.pl> napisał: > [...] > na dwa sposoby, z czego przedstawiam tu tylko jeden, który wymaga dwukrotnego > przeczytania logów, ale jest oszczędniejszy z punktu widzenia pamięci niż > drugi, który w pierwszej kolejności wczytuje logi *w całości* do pamięci. > [...] Czyli wygląda, że ja zacząłem rzeźbić ten drugi. :D > To byłoby jakoś tak: > [...] Podziwiam Cię drugi raz w życiu. KAcper -- Mail => www.rot13.com
Re: problem logiczny ze skryptem
Author: Szymon Sokół
Date: Tue, 07 Dec 2010 09:12
Date: Tue, 07 Dec 2010 09:12
13 lines
1668 bytes
1668 bytes
Kacper Perschke <zbp.yvnzt@rxupferc.ercpnx> wrote: > Podziwiam Cię drugi raz w życiu. Dopiero drugi? No rozczarowany jestem... ;-> A ten program pewnie dałoby się jeszcze trochę ulepszyć, np. zamiast listy adresów na sztywno wpisanej w kodzie (@skrzynki) używać @ARGV. Ale to już banalna zmiana. -- Szymon Sokół (SS4004,SS316-RIPE) -- Network Manager B Computer Center, University of Mining and Metallurgy, Cracow, Poland. O http://2510053385/~szymon/ PGP key id: RSA: 0x61094A7D, DSS: 0xF9289982 F Free speech includes the right not to listen, if not interested -- Heinlein H
Re: problem logiczny ze skryptem
Author: Maciej Misiak
Date: Thu, 09 Dec 2010 00:09
Date: Thu, 09 Dec 2010 00:09
15 lines
1716 bytes
1716 bytes
W dniu 2010-12-06 22:25, Szymon Sokół pisze: > On Mon, 06 Dec 2010 21:10:18 +0100, Maciej Misiak wrote: > >> 3. znaczenia pętli for ($i=309;$i>=31;$i--) nie rozumiem, więc pozostaje >> tylko przypuszczać: czytanie pliku "$dir/maillog.$i" wyciągnij przed tą >> pętlę. Po co 309-31 razy go wczytujesz? I x2, bo dla dwóch skrzynek? > > Ej, skup się. On nie czyta tego samego pliku, tylko pliki o nazwach > maillog.309, maillog.308, i tak dalej aż do maillog.31. Czasami trzeba to powiedzieć wprost: ja jestem tylko Misiem o bardzo małym rozumku... :) -- grizzley
Re: problem logiczny ze skryptem
Author: gregor
Date: Sat, 11 Dec 2010 17:30
Date: Sat, 11 Dec 2010 17:30
4 lines
1061 bytes
1061 bytes
dzieki Panowie wszystkim za pomoc, na pewno sugestie na przyszlosc zastosuje, wiedzialem, ze uzyskam fachowa pomoc :) gregor
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads