我看到我让很多人感到困惑。让我澄清一下。
我有一个名为logdetail.txt
的日志文件。在这个文件中有很多信息。在日志文件中,每个用户的信息都存储在Final Command Run <command>
下。在每个Final Command
字符串下,有我需要收集的信息,例如用户ID,ID状态,到期日期......
logdetail.txt
示例
Final Command Run User ID_1 Expiration Validation Status More Info More info Final Command Run User ID_2 Expiration Validation Status Less info Final Command Run User ID_3 Expiration Validation Status More info
我需要输出文件logssummary.txt
来显示类似
User ID_1, Expiration, Validation
User ID_2,
我改变了下面的答案,我添加了一些东西,但它没有用。
use strict;
use warnings;
use Data::Dumper;
my @all;
my %data = ();
open (Log_summary,">logsummary.txt");
open (INPUTFILE, "logdetail.txt");
while (%data = <INPUTFILE>) {
next if /^\s*$/; # skip empty lines
if (/^\s*Final\s*$/) {
push @all, { %data };
%data = ();
next;
}
my ($key, $value) = split /\s*=\s*/, $_, 2;
trim($key);
trim($value);
$data{$key} = $value;
}
push @all, { %data } if (%data); # in case there is no Final at the end print Dumper \@all;
sub trim {
$_[0] =~ s/^\s+//;
$_[0] =~ s/\s+$//;
}
close(INPUTFILE);
print Log_summary "\nNo more input - exiting\n";
print "\nNo more input - exiting\n";
close Log_summary;
exit;
答案 0 :(得分:1)
尽可能地说,你在“Begin”之间的行之间有记录,并且你希望能够访问它们。这是解析这样一个文件的简单方法。我正在剥离前导和尾随空格,并补偿格式化中的空格。
在每个开头,它会将%data
中的任何内容转储到@all
并开始收集新的内容。
如果您愿意,可以尝试使用输入记录分隔符$/
一次读取完整记录,而不是逐行读取。不确定这会让事情变得更容易。
use strict;
use warnings;
use Data::Dumper;
my @all;
my %data = ();
while (<>) {
next if /^\s*$/; # skip empty lines
if (/^\s*Begin\s*$/) {
push @all, { %data };
%data = ();
next;
}
my ($key, $value) = split /\s*=\s*/, $_, 2;
trim($key); trim($value);
$data{$key} = $value;
}
push @all, { %data } if (%data); # in case there is no Begin at the end
print Dumper \@all;
sub trim {
$_[0] =~ s/^\s+//;
$_[0] =~ s/\s+$//;
}
答案 1 :(得分:0)
为什么不只是grep '\(Name|ID\)' yourfile.txt > results.txt
?