>я бы посоветовал использовать perl все таки он изобретен для обработки текста
>и как никто лучше справляеться с єтой задачей
>
>ну вот где-то так.. печатал сразу тут так что на ерроры не
>проверял. Ок спасибо за совет и ответ, я таки, буду пытаться это переделать на PERL-е.
Но алгоритм всё равно не работает должным образом...
Вот фрагмент текста письма, находящегося в файле: ./mail/111
Received: (qmail 29944 invoked from network); 8 Jan 2003 07:10:33 -0000
Received: from dev212.mailshell.com (HELO mailshell.com) (71.129.195.163)
by dev50.mailshell.com with SMTP; 8 Jan 2003 07:10:33 -0000
Received: (qmail 26211 invoked by uid 99); 8 Jan 2003 07:10:33 -0000
Message-ID: <20030108071033.15907.qmail@mailshell.com>
Received: (qmail 13669 invoked from network); 8 Jan 2003 07:10:31 -0000
Received: from unknown (HELO anclsmtp03.myfamily.com) (63.92.90.192)
by www.mailshell.com with SMTP; 8 Jan 2003 07:10:31 -0000
Received: from ancnews01 (10.6.8.151) by anclsmtp03.myfamily.com (LSMTP for Windows NT v1.1b) with SMTP id <22.00312C4E@anclsmtp03.myfamily.com>; Wed, 8 Jan 2003 0:11:17 -0700
X-Sender: <unsubscribe.nbrc8744.000001.1048576.0.0@unsubscribe.myfamily.com>
Reply-To: <unsubscribe.nbrc8744.000001.1048576.0.0@unsubscribe.myfamily.com>
From: "Ancestry Special Offer" <newsletter@Reply.MyFamilyInc.com>
To: "Mailshell User" <nospam@mailshell.com>
Subject: Connect with your ancestors online
Date: Wed, 08 Jan 2003 07:11:15 -0000Connect with your ancestors online. Join Ancestry.com
...
Всё ниже со слова Connect является заголовком, или по крайней мере, не нуждается в обработки по IP.
Вот ваш предложенный код:
#!/usr/bin/perl
use Socket;my $file = './mail/111';
my @ips;
open(FILE,"<$file");
while(<FILE>){
if ( /(\d+\.\d+\.\d+\.\d+)/ ){ # Первый алгоритм
# if ( /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/ ){ # Второй алгоритм
my $ip = $1;
@ips = push(@ips,$ip); #для того чтобы поместить айпишник в масив ips(если нужно)
print "$ip\n"; # для того чтобы вывести его
$ip = inet_aton($ip);
$name = gethostbyaddr($ip, AF_INET); # для того чтобы вернуть его доменое имя
}
}perl
При первом алгоритме имеем такой вывод:
71.129.195.163
63.92.90.192
10.6.8.151
8744.000001.1048576.0
8744.000001.1048576.0
При втором алгоритме имеем следующий вывод:
71
63
10
Вот из-за наличия таких "противных" строк как Reply-To: <unsubscribe.nbrc8744.000001.1048576.0.0@unsubscribe.myfamily.com>
Первый алгоритм не до конца эффективен, так как нужно строго указать, что цифр может быть НЕ менее 1, но и не более 3.
Второй алгоритм, почему-то, выделяет прочто первую циру каждого IP-шника, хотя отфильтровует IP верно.
>Ну и почитайте книжку по регулярным выражениям.
Подскажите пожалуйста сею книжку, а лучше и url на неё. Я составлял алгоритм, основываясь на этом http://www.opennet.me/docs/RUS/bash_scripting_guide/c11895.h...
P.S. Чувствую тему уже нужно переносить в раздел PERL, но если кто то уверен, что с текущей задачей можно справиться средствами Bash, пожалуйста, предлогайте свои решения :)
Напоминаю папку с письмами,что бы проверить как скрипт должен работать в реальных условиях, можно скачать тут http://ILYA.pp.ua/m.7z