在perl中的if语句中使用grep

时间:2014-05-12 22:19:34

标签: perl

我有多个看起来像dmesg输出的日志文件。我需要解析并将所有这些文件中的某些结果存储到一个输出文件中。 Ex输入文件1:

 .....
 Started 1399343129
 KbPerSec  1222
 KiloBytes 9302938
 Status 83
 StorageUNit unitname
 Ended 1399473434
 .......

输出文件:

  1399343129  1222  9302938 83 unitname 1399473434
  <input file2 numbers>
  <input file3 numbers>
  .....

所以,我使用grep,并将grep结果拆分以获得我想要的数字。这是我的代码的样子。 <TRY>是我的文件句柄。

my (@grepres, @splitres);
my ($size, $start, $bw);

if(@grepres=grep{/KbPerSec/} <TRY>){
  @splitres=split(' ',$grepres[0]);
  $bw=$splitres[1];
  print "1. $bw\n";
}

if(@grepres=grep{/Started/} <TRY>){
  @splitres=split(' ',$grepres[0]);
  $start=$splitres[1];
  print "$start\n";
}

...
  1. 但我的代码只执行第一个if,然后停止。为什么它不执行其他if语句?
  2. 这似乎不是一种有效的方法。我怎样才能做得更好?

2 个答案:

答案 0 :(得分:1)

  1. 由于列表上下文中的<TRY>会占用TRY文件句柄中的所有数据,因此对<TRY>的后续调用将返回空。如果要重用文件流中的数据,
  2. 一个。将流保存到变量

     my @try = <TRY>;
     if ( grep ..., @try ) {
        ...
     }
     if ( grep ..., @try ) { 
        ...
     }
    

    湾重新打开文件或seek回到开头

     open TRY, '<', $try_file
     ...
     if (grep ..., <TRY>) {
        ...
     }
     close TRY;
     open TRY, '<', $try_file
     if (grep ..., <TRY>) {
        ...
     }
    
     open TRY, '<', $try_file
     ...
     if (grep ..., <TRY>) {
        ...
     }
    
     seek TRY, 0, 0;  # reset cursor position to start of file
    
     if (grep ..., <TRY>) {
        ...
     }
    

答案 1 :(得分:1)

这是一种可能的方法,取决于从记录到记录的字段顺序相同。

更新:更改了结束条件匹配。

#!/usr/bin/perl
use strict;
use warnings;

my @data;
while (<DATA>) {
    if (/^Started/ .. /^Ended/) {
        push @data, /^\S+ (.+)$/;
        print join(" ", splice @data), "\n" if /^Ended/;    
    }
}

__DATA__
.....
Started 1399343129
KbPerSec  1222
KiloBytes 9302938
Status 83
StorageUNit unitname
Ended 1399473434
.......

打印

1399343129  1222 9302938 83 unitname 1399473434