[解决] 抱歉我的错误代码(我是Perl的新手)。 我需要编写一个脚本来搜索文件中的某一行文本(它必须包含“身份验证失败”和“user = username”形式的用户名)并查找包含相同用户名的行的可能迭代以及在同一天录制的“身份验证失败”。日期和月份是我正在分析的每行文字的前两个单词。因此,每一行都是:
"Jun 24 bla bla bla authentication failure bla bla bla user=mickey_mouse"
无论如何,无论我的目标是什么,我都确定问题是我对Perl缺乏经验。所以,请只是看看我的代码,并告诉我是否有什么不好。
这是我写的'到现在为止的代码
#!usr/bin/perl
if (!defined($ARGV[0]) or !defined($ARGV[1])) {
die "\nMissing arguments.\n";
}
open(FILE,$ARGV[0]) or die "Cannot open log file";
open(FILE1,$ARGV[0]) or die "Cannot open log file";
foreach $line(<FILE>) {
chomp;
if($line=~/authentication failure/ and $line=~/ user=/) {
$count = 0;
@chops = split("=", $line);
$currentUser = $chops[-1];
chomp($currentUser);
@chops1 = split(" ", $line);
$currentDate = $chops1[0]." ".$chops1[1];
chomp($currentDate);
print "\nUSER: $currentUser DATE: $currentDate\n";
foreach $line1(<FILE1>) {
chomp;
if(index($line1, $currentUser) != -1 and
index($line1, $currentDate) != -1 and
$line1 =~ /authentication failure/) {
$count++;
print $count;
if(count>=2) {
push($currentUser,@authenticFails);
last;
}
}
}
}
}
print @authenticFails;
close(FILE);
close(FILE1);
[求助]感谢您对sputnick的回答和建议。无论如何,我弄清楚我的问题是什么。我只需要在嵌套的块中写入第二个打开(ARGV [0])的东西(而不是在两个fors之前)并在退出之前关闭它。对于我使用第一个块进行分析的每个当前行,这是重新开始迭代文件每一行的唯一方法。
再次感谢你们。
答案 0 :(得分:3)
我会使用菱形运算符 <>
和哈希计算出现次数:
use Modern::Perl; # enable strictures and features like "say"
my %hash;
# looping line by lines over the files
while (my $line = <ARGV>) {
if ($line =~ /^(\w+\s+\d+)\s+.*?authentication\s+failure.*?user=(.*)/) {
$hash{"$2|$1"}++;
}
}
foreach my $key (keys %hash) {
my ($user, $day) = split /\|/, $key;
say "$hash{$key} auth failures for $user on $day";
}
3 auth failures for mickey_mouse on Jun 24
1 auth failures for mickey_mouse on Jun 23
1 auth failures for xxx on Jun 21
use strict; use warnings;
或use Modern::Perl
open my $fh, "<", "file" or die $!
,您甚至可以通过添加or die
来省略use autodie
,例如Dadid W建议。