Автор Тема: Статистика из текстового файла  (Прочитано 5068 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн MasteRaf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Есть текстовый файл с инфой:
-----\\\\------
.................tcp 10.64.66.4(0) -> 89.111.180.41(0)
-----\\\\------
в скобках номер порта. Надо вывести инфу (лучше в файл), какие использовались порты (без повтора желательно). Для гуру наверное это несложно, 5 сек. Помогите (или подскажите)

P.S. Вчера впервые узнал, что такое Perl

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Статистика из текстового файла
« Ответ #1 : 03 Июля 2007, 19:24:55 »
Что-то вроде этого:

#!/usr/bin/perl -w

use strict;

my $fileDlyaChteniya = \'1.txt\';
my $fileDlyaZapisi   = \'2.txt\';
my %ports;

open FHR, $fileDlyaChteniya or die "Can\'t open $fileDlyaChteniya: $!\\n";

while ( ) {
   $ports{$1}++ while /\\((\\d+[^)])/g;
}

close FHR or die "Can\'t close $fileDlyaChteniya: $!\\n";
open FHW, "> $fileDlyaZapisi" or die "Can\'t open $fileDlyaZapisi: $!\\n";

while ( my($port,$q) = each %ports ) {
   print FHW "$port => $q\\n";
}
close FHW or die "Can\'t close $fileDlyaZapisi: $!\\n";
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн MasteRaf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Статистика из текстового файла
« Ответ #2 : 03 Июля 2007, 20:06:08 »
Спасибо, vladsu!

Цитировать
while ( my($port,$q) = each %ports ) {
   print FHW "$port => $q\\n";
}


здесь просто опечатка? - вместо $port правильно писать $ports  ???

Если не сложно, объясни вот это подробно
Цитировать
  $ports{$1}++ while /\\((\\d+[^)])/g;


или подскажи, в каких разделах учебников это можно найти (особенно  /\\((\\d+[^)])/g )

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Статистика из текстового файла
« Ответ #3 : 03 Июля 2007, 23:35:50 »
Цитировать
MasteRaf:
здесь просто опечатка? - вместо $port правильно писать $ports ???

А Вы не пробовали сначала запустить? Нет, здесь нет опечаток.

Цитировать
MasteRaf:
или подскажи, в каких разделах учебников это можно найти (особенно /\\((\\d+[^)])/g )

Здесь сразу несколько тем.
Это  $ports{$1}
читайте в разделе про хеши.
Об этом ++
читайте в разделе про операции.
Об этом while
читайте в разделе о циклах и в разделе об укороченной записи. В привычном для Вас формате это будет выглядеть так
while ( /\\((\\d+[^)])/g ) {
 $ports{$1}++;
}

А это /\\((\\d+[^)])/g
регулярное выражение. Которое начинается символом /, далее ищет в переменной $_ открывающую скобку за что отвечает \\(, сразу после скобки ищутся любые цифры за что отвечает  \\d+ и цифры ищутся до тех пор пока не встретится закрывающая скобка [^)], все найденные цифры сохраняются в переменной $1, за это отвечает другая пара скобок (), далее следует окончание регекспо /, а буква g нужна для того, чтобы сообщить компилятору, чтобы он не прекращал поиск в переменной $_ пока не будет достигнут её конец.

И ещё нужно посмотреть тему о спец. переменных, в данном случае о $_, даннай переменная заполняется в строке while ( ) {.

Вроде всё.

Совет. Если же Вы решили изучить Перл, то лучше читать книгу с начала, а не урывками.
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн MasteRaf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Статистика из текстового файла
« Ответ #4 : 05 Июля 2007, 18:15:49 »
Пасиб, vladsu.
Появилась модифицированная задача - теперь порты в текстовом файле не отделены скобками, а просто пробелами. Так вот,  SRCport  идет после 16-го пробела, а DST после 17-го. Как бы их рвануть оттуда допустим по тому же регулярному выражению?

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Статистика из текстового файла
« Ответ #5 : 05 Июля 2007, 21:52:33 »
Пример пожалуйста.
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн MasteRaf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Статистика из текстового файла
« Ответ #6 : 08 Июля 2007, 23:26:23 »
2007-06-29 14:15:00   456778746   0011:00:48:45,048   82.200.22.33   1   86   0011:00:48:28,628   0011:00:48:28,628   0   0   82.176.121.61   82.200.22.43   0.0.0.0   1   0   49151   46303   17   32   16   0   0   0   0


(даже не пробел, а табуляция наверное между ними)

Оффлайн MasteRaf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Статистика из текстового файла
« Ответ #7 : 08 Июля 2007, 23:29:13 »
49151 SRCport
46303 DST

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Статистика из текстового файла
« Ответ #8 : 10 Июля 2007, 16:51:57 »

use strict;

my $fileDlyaChteniya = \'1.txt\';
my $fileDlyaZapisi   = \'2.txt\';
my %ports;

open FHR, $fileDlyaChteniya or die "Can\'t open $fileDlyaChteniya: $!\\n";

while ( ) {
   map {$ports{$_}++} ((split /\\s+/,$_))[17,18];
}

close FHR or die "Can\'t close $fileDlyaChteniya: $!\\n";
open FHW, "> $fileDlyaZapisi" or die "Can\'t open $fileDlyaZapisi: $!\\n";

while ( my($port,$q) = each %ports ) {
   print FHW "$port => $q\\n";
}
close FHW or die "Can\'t close $fileDlyaZapisi: $!\\n";
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28