Perl 搜索字符串并在查找关键字时结束
我看到我把很多人弄糊涂了。让我澄清一下 我有一个名为Perl 搜索字符串并在查找关键字时结束,perl,Perl,我看到我把很多人弄糊涂了。让我澄清一下 我有一个名为logdetail.txt的日志文件。在这个文件中有很多信息。在日志文件中,每个用户的信息都存储在Final Command Run下。在每个Final命令字符串下,都有我需要收集的信息,比如用户ID、ID状态、过期日期 logdetail.txtsample Final Command Run User ID_1 Expiration Validation Status More Info More info Final Comman
logdetail.txt
的日志文件。在这个文件中有很多信息。在日志文件中,每个用户的信息都存储在Final Command Run
下。在每个Final命令
字符串下,都有我需要收集的信息,比如用户ID、ID状态、过期日期
logdetail.txt
sample
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
我改变了下面的答案,添加了一些东西,但它不起作用
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;
使用严格;
使用警告;
使用数据::转储程序;
我的所有;
我的%data=();
打开(Log_summary,“>logsummary.txt”);
打开(输入文件“logdetail.txt”);
而(%data=){
下一个if/^\s*$/#跳过空行
如果(/^\s*Final\s*$/){
推送@all,{%data};
%数据=();
下一个
}
my($key,$value)=拆分/\s*=\s*/,$\u2;
修剪(钥匙);
修剪(价值);
$data{$key}=$value;
}
按@all,{%data}如果(%data);#如果最后没有最终打印转储文件\@all;
副修剪{
$\[0]=~s/^\s+/;
$\[0]=~s/\s+$/;
}
关闭(输入文件);
打印日志\u摘要“\n无更多输入-正在退出\n”;
打印“\n不再输入-正在退出\n”;
关闭日志摘要;
出口
为什么不干脆grep'\(Name | ID\)'yourfile.txt>results.txt
?为什么不干脆grep'\(Name | ID\)'yourfile.txt>results.txt
?就我所知,你的行之间有用“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+$//;
}
使用严格;
使用警告;
使用数据::转储程序;
我的所有;
我的%data=();
而(){
下一个if/^\s*$/#跳过空行
如果(/^\s*开始\s*$/){
推送@all,{%data};
%数据=();
下一个
}
my($key,$value)=拆分/\s*=\s*/,$\u2;
修剪($key);修剪($value);
$data{$key}=$value;
}
按@all,{%data}如果(%data);#以防结尾没有开始
打印转储文件\@all;
次修剪{
$\[0]=~s/^\s+/;
$\[0]=~s/\s+$/;
}
据我所知,您的记录位于用“开始”表示的行之间,您希望能够访问这些记录。这是解析这样一个文件的简单方法。我正在剥离前导和尾随空格,并对格式中的空格进行补偿
每次开始时,它都会将%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+$//;
}
使用严格;
使用警告;
使用数据::转储程序;
我的所有;
我的%data=();
而(){
下一个if/^\s*$/#跳过空行
如果(/^\s*开始\s*$/){
推送@all,{%data};
%数据=();
下一个
}
my($key,$value)=拆分/\s*=\s*/,$\u2;
修剪($key);修剪($value);
$data{$key}=$value;
}
按@all,{%data}如果(%data);#以防结尾没有开始
打印转储文件\@all;
次修剪{
$\[0]=~s/^\s+/;
$\[0]=~s/\s+$/;
}
我认为这可能行不通,因为他只想在文件中的某些点上查找名称或ID,因此可能有一些不属于搜索范围。但是我可能错了,因为我已经读了三遍问题,我仍然不能完全确定他在找什么。它在Windows2003服务器上,我只能访问perl和batch。把事情弄清楚。在ID上有状态信息的大日志文件。我想输出与该IDEAH关联的信息。很难说。很容易grep第一个开始的行号,然后grep从该点开始。@moe:在这种情况下,有两个简单的循环:openfile。读取/转储行,直到达到开始。然后继续循环#2,阅读并打印出以ID或名称开头的行。听起来这样可以做到,你有例子吗?我认为这可能不起作用,因为他只想在文件中的某些点找到名称或ID,因此可能有一些不在搜索范围内。但是我可能错了,因为我已经读了三遍问题,我仍然不能完全确定他在找什么。它在Windows2003服务器上,我只能访问perl和batch。把事情弄清楚。在ID上有状态信息的大日志文件。我想输出与该IDEAH关联的信息。很难说。很容易grep第一个开始的行号,然后grep从该点开始。@moe:在这种情况下,有两个简单的循环:openfile。读取/转储行,直到达到开始。然后继续循环#2,阅读并打印出以ID或名称开头的行。听起来这样可以做到,你有例子吗?你能编辑你的解释吗?我发现你的问题有点不清楚你想达到什么目标。哦,我明白了。。。你说的是“开始”这个词。对于您拥有的示例输入,这意味着您想跳过“用户B”信息,只获取“用户A”并转发?您能重新格式化测试文件吗?如果每行缩进至少四个字符,它将显示在灰色背景中。另外,请确保您准确指定您要查找的内容。什么是log.txt
和result.txt
?您正在分析一个或多个日志?最后一行是否假定为End
?用户StackOverflow来自何处?请不要在系统上创建多个帐户。如果您无法访问一个帐户