[英]Find a match using regex - perl
I have a TCPDUMP file that contains many uses of the word USER and PASS and I need to work out a regex for finding them all and then printing how many there are for each. 我有一个TCPDUMP文件,其中包含USER和PASS单词的许多用法,我需要计算出一个正则表达式以查找所有单词,然后打印出每个单词的数量。 (or any different way; regex is my first choice for these problems though).
(或任何其他方式;尽管如此,正则表达式是我的首选)。 And my split seems to not be working right I think.
我认为我的分歧似乎行不通。 Not sure how I am doing this wrong here so any ideas?
不知道我在这里怎么做错了,所以有什么想法吗? Thanks in advance!
提前致谢!
Here is an example of the input file (note: this is just the first line of the file of 2006 lines. The format is identical, but the numbers, symbols, and letters DO change in each line) 这是输入文件的示例(注意:这只是2006行的文件的第一行。格式相同,但是数字,符号和字母在每一行中都发生变化)
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...<.@.q...br.f...o.... ...\.bfP....Y..echo open 0.0.0.0 8884 > USER 1 1 >>
code: 码:
#!/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";
I don't really know perl, but I know regex... and you could use this expression to match any line beginning with 22.28 which also contains USER/PASS: 我不太了解perl,但是我知道regex ...,您可以使用此表达式来匹配以22.28开头的任何行,该行还包含USER / PASS:
(?<=22\.28)USER|PASS
I'm not 100% clear on what you need, if you specify further, I can probably help. 我不清楚您的需求,如果您进一步指定,我可能会帮助您。
my @lines = (<MYFILE>);
my @matches = grep { $_ =~ /(PASS|USER)/i } @lines;
Should work? 应该管用?
With Line Numbers: 带行号:
my @lines = (<MYFILE>);
my %results;
map {
if ($lines[$_] =~ /(pass|user)/i) {
$results{$_} = $lines[$_];
}
} 0..$#lines;
%results will have keys as line numbers, value is line. %results将具有键作为行号,值是line。 Grep is faster because its recursive though, this will be O(n2) iirc.
Grep更快,因为它是递归的,这将是O(n2)iirc。
Now.. 现在..
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;
Here's a USER/PASS counting option: 这是一个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
Output: 输出:
PASS => 5
USER => 4
Hope this helps! 希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.