Perl 如何从日志文件中获取所需的pid

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

我试图为我的项目自动化一个任务,我必须解析一个日志文件并搜索特定的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++)
{

  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