Perl 如何从日志文件中获取所需的pid
我试图为我的项目自动化一个任务,我必须解析一个日志文件并搜索特定的pid。如果pid遇到超过50次,那么我必须打印我的消息 我的代码:Perl 如何从日志文件中获取所需的pid,perl,Perl,我试图为我的项目自动化一个任务,我必须解析一个日志文件并搜索特定的pid。如果pid遇到超过50次,那么我必须打印我的消息 我的代码: #!/usr/bin/perl -w use strict; open(my $fh,"<","UIlogs.txt") or die "can not open the file $!"; my @lines = <$fh>; close($fh); my $count=0; for(my $i=0; $i<=$#lines;$i
#!/usr/bin/perl -w
use strict;
open(my $fh,"<","UIlogs.txt") or die "can not open the file $!";
my @lines = <$fh>;
close($fh);
my $count=0;
for(my $i=0; $i<=$#lines;$i++)
{
if($lines[$i] =~ m/Input event injection from pid (\d+) failed/gi)
{
#print"UI freez\n";
print"$1\n";
}
}
#/usr/bin/perl-w
严格使用;
open(my$fh,“哈希对于跟踪显示的xxxxx数量非常有用
e、 g
通常,您只希望为每个超出限制的PID打印一条警告消息,但是,我们会将哈希处理保存到最后,例如:
my %pids = (); # initialise hash
for ( ... ) { # process lines
if ( ... ) { # match line
$pids{$foundpid} += 1;
}
}
# now scan our hash of pids and filter those that failed the condition
foreach my $pid ( sort { $a <=> $b keys %pids ) ) {
if ( $pids{$pid} > 100 ) {
print( "Bad PID $pid was seen " . $pids{$pid} . " times!\n" );
}
}
my%pids=();#初始化哈希
对于(…){#工艺线
如果(…){匹配线
$pids{$foundpid}+=1;
}
}
#现在扫描我们的PID散列并过滤那些不符合条件的PID
foreach my$pid(排序{$a$b键%pid)){
如果($pid{$pid}>100){
打印(“看到错误的PID$PID”。$PID{$PID}。“次!\n”);
}
}
稍后,如果您想使代码更加简洁,可以将最后一部分重新编写为:
my @failedpids = grep { $pids{$_} > 100 } keys %pids;
print( "Failed PIDs were: " );
print( join( ", ", sort { $a <=> $b } @failedpids ) );
print( "\n" );
my@failedpids=grep{$pids{$\u}>100}键%pids;
打印(“失败的PIDs为:”);
打印(join(“,”,sort{$a$b}@failedpids));
打印(“\n”);
散列有助于跟踪显示的xxxxx数量
e、 g
通常,您只希望为每个超出限制的PID打印一条警告消息,但是,我们会将哈希处理保存到最后,例如:
my %pids = (); # initialise hash
for ( ... ) { # process lines
if ( ... ) { # match line
$pids{$foundpid} += 1;
}
}
# now scan our hash of pids and filter those that failed the condition
foreach my $pid ( sort { $a <=> $b keys %pids ) ) {
if ( $pids{$pid} > 100 ) {
print( "Bad PID $pid was seen " . $pids{$pid} . " times!\n" );
}
}
my%pids=();#初始化哈希
对于(…){#工艺线
如果(…){匹配线
$pids{$foundpid}+=1;
}
}
#现在扫描我们的PID散列并过滤那些不符合条件的PID
foreach my$pid(排序{$a$b键%pid)){
如果($pid{$pid}>100){
打印(“看到错误的PID$PID”。$PID{$PID}。“次!\n”);
}
}
稍后,如果您想使代码更加简洁,可以将最后一部分重新编写为:
my @failedpids = grep { $pids{$_} > 100 } keys %pids;
print( "Failed PIDs were: " );
print( join( ", ", sort { $a <=> $b } @failedpids ) );
print( "\n" );
my@failedpids=grep{$pids{$\u}>100}键%pids;
打印(“失败的PID为:”);
打印(join(“,”,sort{$a$b}@failedpids));
打印(“\n”);
这实际上只是一个简单的计数练习。您使用正则表达式捕获字符串,并使用哈希计算其频率:
perl -nlwe '$a{$1}++ if /Input event injection from pid (\d+)/
END { for (keys %a) { print qq($_ -> $a{$_}) } }' inject.log
我从您的输入中获得以下输出:
2061 -> 38
2019 -> 2
2041 -> 2
作为程序文件,它将如下所示:
while (<>) {
$a{$1}++ if /Input event injection from pid (\d+)/;
}
for my $key (keys %a) {
print "$key -> $a{$key}\n";
}
关于代码的一些注释:
- 除非您确实需要知道正在循环的数组的索引,否则不要对循环使用C样式。相反,请使用Perl样式,通常称为“foreach”:
对我的$line(@lines)
- 如果不需要的话,不要将整个文件读入数组。您可以像这样简单地迭代文件句柄:
while()
——这将在每次迭代中读入一行到$(或您选择的变量,例如while(my$foo=)
),直到文件eof
结束
- 很高兴看到您正在使用
使用严格的
和警告。通常情况下,使用警告
比在shebang上使用-w
更具可读性,而且它是一个词汇杂注,而不是全局的
这实际上只是一个简单的计数练习。您使用正则表达式捕获字符串,并使用哈希计算其频率:
perl -nlwe '$a{$1}++ if /Input event injection from pid (\d+)/
END { for (keys %a) { print qq($_ -> $a{$_}) } }' inject.log
我从您的输入中获得以下输出:
2061 -> 38
2019 -> 2
2041 -> 2
作为程序文件,它将如下所示:
while (<>) {
$a{$1}++ if /Input event injection from pid (\d+)/;
}
for my $key (keys %a) {
print "$key -> $a{$key}\n";
}
关于代码的一些注释:
- 除非您确实需要知道正在循环的数组的索引,否则不要对循环使用C样式。相反,请使用Perl样式,通常称为“foreach”:
对我的$line(@lines)
- 如果不需要的话,不要将整个文件读入数组。您可以像这样简单地迭代文件句柄:
while()
——这将在每次迭代中读入一行到$(或您选择的变量,例如while(my$foo=)
),直到文件eof
结束
- 很高兴看到您正在使用
使用严格的
和警告。通常情况下,使用警告
比在shebang上使用-w
更具可读性,而且它是一个词汇杂注,而不是全局的
你真的有双倍行距的日志文件吗?每隔一行空行?@TLP-ya,每隔一行空行会在那里,这对我的解决方案不重要。你真的有双倍行距的日志文件吗?每隔一行空行吗?@TLP-ya,每隔一行空行会在那里,这对我的解决方案不重要。my%pids=();
是冗余的,所有新声明的哈希(和数组)是空的。..+=1
又名++
。这是一个非常有效的解释,这就是为什么我的评论仍然很重要。你可以做各种事情让自己在Perl中感觉自在,但你应该知道这是多余的。你这样做是在教别人一些不正确的东西,这是不正确的。我认为你每种语言都有自己的初始化规则,这并不是说你可以决定“因为你可以,你应该”"。在告诉新手如何做某事的情况下,用Perl告诉他如何做是正确的方法。任何其他方法都需要附带解释,例如,我想为我的所有哈希和数组分配一个空列表,只是为了确定,但这不是严格要求的
,或者它是不正确的。这不是一种意见。my%pids=();
是冗余的,所有新声明的哈希(和数组)是空的。..+=1
又名++
。这是一个非常有效的解释,这就是为什么我的评论仍然很重要。你可以做各种事情让自己在Perl中感觉自在,但你应该知道这是多余的。你这样做是在教别人一些不正确的东西,这是不正确的。我认为你每种语言都有它自己的初始化规则,这并不是说你可以决定t