0

ログからプロセスにかかった時間を抽出しようとしています。

たとえば、ログには次のものが含まれます (関連する行):

Time for search copy=15 s.
Time for content copy=45 s.
Time for unzip reply=20 s.

上記の行は、ログ内の必要のない他の多くの行に隣接しています。このようなログ (ログ名は process.out) を生成するジョブにはいくつかの種類があるため、各ジョブの識別子として Job_name があります。特定のジョブのログを読み取るためにハッシュを使用しています。コードは次のとおりです。

#!/usr/bin/perl

use strict;
use warnings;
use File::Basename;

my %Log_name = ();
my %File_name = ();
my %filetoread = ();
my %filetoreadStrings = ();
my @ftr      = ();
my @reply    = ();
my @content  = ();
my @search   = ();
my %Reply    = ();
my %Search   = ();
my %Content = ();
my $curr_dir=`pwd`;
chop($curr_dir);

my $Log_name = "ABC-DEF";
my $File_name=<$curr_dir/p*.out>;
my $filetoread = basename ($File_name);
my $filetoreadStrings=`strings $filetoread  | egrep "(Time for)"`;
@ftr = split('\n', $filetoreadStrings);
chomp (@ftr);


for (my $count = 0; $count < 6; $count++)    #The lines are repeated 6 times except for the "search copy" line which is repeated twice
{
 $reply[$count] = (grep /Time for unzip reply/, @ftr)[$count];
 $content[$count] = (grep /Time for content copy/, @ftr)[$count];
 $search[$count] = (grep /Time for search copy/, @ftr)[$count];
 if (defined $reply[$count]) 
 {
 ($Reply{$Log_name})  = $reply[$count] =~ /Time for unzip reply=(\d+) s./;

 printf "$Reply{$Log_name}\n";
 }
  if (defined $content[$count]) {
 ($Content{$Log_name})=$content[$count]=~/Time for content copy=(\d+) s./;

 printf "$Content{$Log_name}\n";
  }
  if (defined $search[$count]) {
   ($Search{$Log_name})  = $search[$count] =~ /Time for search copy=(\d+) s./;

   printf "$Search{$Log_name}\n";
  }

 }

上記のコードの出力は次のとおりです。

Use of uninitialized value in concatenation (.) or string at new_try_loop.pl line 46.

上記の出力は、各 printf ステートメントに対応しています。合計時間を計算するには、実際にこれらの時間値を合計する必要がありますが、重要なことは最初に「時間」を取得することであるため、コードには示していません。

ここで何をする必要がありますか?他の情報が必要な場合はお知らせください。

最初、私は for ループを使用していませんでしたが、このコードは機能していました。例えば、

$reply1 = (grep /Time for unzip reply/, @ftr)[0];
$Reply1{$Log_name})  = $reply1 =~ /Time for unzip reply=(\d+) s./;
$reply2 = (grep /Time for unzip reply/, @ftr)[1];
$Reply2{$Log_name})  = $reply1 =~ /Time for unzip reply=(\d+) s./;
$reply3 = (grep /Time for unzip reply/, @ftr)[2];
$Reply3{$Log_name})  = $reply1 =~ /Time for unzip reply=(\d+) s./;
.......... and so on

同様の方法で、$Content{$Log_name} と $Search{$Log_name} に値を格納していました。これらの変数でキャプチャされた正規表現を取得し、後でそれらを追加していました。これを最適化するために for ループを使用しています。

4

1 に答える 1

0

このようなセクション

if (defined $reply[$count]) 
 {
 ($Reply{$Log_name})  = $reply[$count] =~ /Time for unzip reply=(\d+) s./;

 printf "$Reply{$Log_name}\n";
 }

なる

if (defined $reply[$count] && ($reply[$count] =~ /Time for unzip reply=(\d+) s./) ) 
 {
 ($Reply{$Log_name})  = $1
 print "$1\n";
 }

あなたのデータの一部は一致すると思いますが、そうで/Time for unzip reply/はありません/Time for unzip reply=(\d+) s./

于 2013-06-04T10:47:12.267 に答える