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来自何处?请不要在系统上创建多个帐户。如果您无法访问一个帐户