2013-12-09 32 views
2

我有一個TCPDUMP文件,其中包含許多單詞USER和PASS的用法,我需要制定一個正則表達式來查找它們,然後打印每個文件的數量。 (或任何不同的方式;正則表達式是我對這些問題的第一選擇)。我認爲我的分裂似乎並不正確。不知道我在這裏做錯了,所以有什麼想法?提前致謝!使用正則表達式找到一個匹配 - perl

下面是輸入文件的例子(注意:這僅僅是2006行的文件的第一行的格式是相同的,但數字,符號,和字母DO中的每一行改變)

22:28:28.374595 IP 98.114.205.102.1821 > 192.150.11.111.445: Flags [S], seq 147554406, win 64240, options [mss 1460,nop,nop,sackOK], length 0E...<[email protected] ...\.bfP....Y..echo open 0.0.0.0 8884 > USER 1 1 >> 

代碼:

#!/usr/bin/perl -w 
use strict; 
use warnings; 
use diagnostics; 

#opens txt file: read mode 
open MYFILE, '<', 'source_file.txt' or die $!; 

#opens output txt file: write mode 
open OUT, '>', 'Summary_Report.txt' or die $!; 

#open output txt file: write mode 
#used to store header 'split' info 
open OUTFILE, '>', 'Header.txt' or die $!; 

my $start_time = undef; 
my $end_time; 
my $linenum = 0; 
my $user; 
my $pass; 

while (<MYFILE>) { 
    chomp; 
    $linenum++; 
    #print ": $_\n"; ###if I need to see the lines (check)### 

    #separate pieces of information from TCPDUMP into list 
    my @header = split (' ',$_); 
    print OUTFILE "$linenum: @header\n\n"; 

    if (/^22:28/ && !defined($start_time)) { 
     $start_time = $header[0]; 
     #print "$start_time\n"; ###used as a check### 
    } 

    if ($_ = /22:28/) { 
     $end_time = $header[0]; 
    }  

    if ($_ =~ m/USER/i) { 
     $user = $header[10]; 
    } 

    } 

print OUT "Total # of times phrases were used:\n\n 
USER (variations thereof) = $user\n\n 
PASS (variations thereof) = $pass\n\n\n"; 
+0

請發佈您的輸入外觀。 – hwnd

+0

希望我所做的幫助呀。 – user2288

+0

我剛剛意識到我需要一些元字符,這些可能會有所幫助!不太確定如何去解決它們。 – user2288

回答

1
my @lines = (<MYFILE>); 
my @matches = grep { $_ =~ /(PASS|USER)/i } @lines; 

該工作嗎?

加上行號:

my @lines = (<MYFILE>); 
my %results; 
map { 
    if ($lines[$_] =~ /(pass|user)/i) { 
     $results{$_} = $lines[$_]; 
    } 
} 0..$#lines; 

%的結果將有鑰匙的行號,價值線。因爲它的遞歸,Grep更快,這將是O(n2)iirc。

現在..

map { 

    #separate pieces of information from TCPDUMP into list 
    my @header = split (' ',$results[$_]); 
    print OUTFILE "$_: @header\n\n"; 

    if (/^22:28/ && !defined($start_time)) { 
    $start_time = $header[0]; 
    #print "$start_time\n"; ###used as a check### 
    } 

    if ($results[$_] = /22:28/) { 
    $end_time = $header[0]; 
    }  

    if ($results[$_] =~ m/USER/i) { 
     $user = $header[10]; 
    } 

} keys %results; 
+0

實際上我的工作確實奏效了,但它最終重置了我的$亞麻布變量和我的時間變量,但不幸我不能發生 – user2288

+0

您可以推到行號的索引給我一個秒.. –

1

我真的不知道perl的,但我知道正則表達式...,你可以用這句話來匹配22.28開頭的所有行其中還包含USER/PASS:

(?<=22\.28)USER|PASS 

我不是100%清楚你需要什麼,如果你進一步指定,我可以幫忙。

+0

我真正想做的就是使用正則表達式函數來查找位於我的輸入文件中的單詞PASS&USER的所有實例。我知道答案很簡單,但出於某種原因,無論我做什麼都行不通,那對我有幫助嗎? – user2288

+0

你可以使用下面的Perl代碼使用字符串中的匹配來創建一個數組:'@result = $ input =〜m/USER | PASS/ig;'......不知何故,我認爲你並不是追求這麼簡單的東西。 –

1

這裏有一個USER/PASS計數選項:

use strict; 
use warnings; 

my %user_pass; 

while (<DATA>) { 
    $user_pass{$1}++ while /(\bUSER\b|\bPASS\b)/g; 
} 

print "$_ => $user_pass{$_}\n" for keys %user_pass; 

__DATA__ 
USER USER PASS PASS 
PASS 
USER 
USER 
PASS PASS 

輸出:

PASS => 5 
USER => 4 

希望這有助於!