0

アスタリスクのキューステータスに関する統計を抽出する正規表現を構築しようとしています。私は正規表現に比較的慣れていないので、解決策にはほど遠いです。解析する出力は次のとおりです。

Parsing /etc/asterisk/extconfig.conf
0009*007 has 2 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0, A:7, SL:0.0% within 0s
   Members: 
      0009*001 (Local/0009*001@queue/nj) (In use) has taken no calls yet
   Callers: 
      1. SIP/chan5-000a29f2 (wait: 0:08, prio: 0)
      2. SIP/0139*741-000a29f7 (wait: 0:03, prio: 0)

実際の出力には複数のキューの情報が含まれるため、2 行目から繰り返されます。最初の行は 1 回だけ表示されます。

最後に、キュー ID (この例では 0009*007) と、それぞれの待ち時間を含む呼び出しのリストを取得する必要があります。

これまでのところ、次の正規表現を使用してキュー番号を照合しました。

\b^[0-9]{4}\*[0-9]{3}\b

しかし、これはうまくいきません。呼び出しと待ち時間を一致させる方法がわからない。理想的には、次のような出力が必要です。

0009*007,1,0:08
0009*007,2,0:03

最終的なスクリプトはおそらく Perl で書く予定です。

4

2 に答える 2

2

m.buettner が示したように、1 つの正規表現でこれを行うことはできません。ただし、データの繰り返しの性質に関する知識に基づいて、必要なデータでハッシュを生成し、最後にハッシュを出力できます。

#!/usr/bin/perl

my %queues;
my $current_queue;

while (<DATA>) {
  chomp;

  if (m/^(\d+\*\d+)/) {
    $current_queue = $1;
  }
  elsif (m/^\s+(\d)\..+?\(wait:\s+([\d\:]+),/) {
    $queues{$current_queue}{$1} = $2;
  }
}

foreach my $queue (sort keys %queues) {
  foreach my $caller (sort keys %{ $queues{$queue} }) {
    print join (',', $queue, $caller, $queues{$queue}{$caller}) . "\n";
  }
}

exit;

__DATA__
Parsing /etc/asterisk/extconfig.conf
0009*007 has 2 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0, A:7, SL:0.0% within 0s
   Members:
      0009*001 (Local/0009*001@queue/nj) (In use) has taken no calls yet
   Callers:
      1. SIP/chan5-000a29f2 (wait: 0:08, prio: 0)
      2. SIP/0139*741-000a29f7 (wait: 0:03, prio: 0)
于 2012-11-20T14:56:14.663 に答える
2

簡単なステート マシン ソリューションを次に示します。ログ ファイルで予想されるバリエーションの種類に応じて、正規表現を変更する必要がある場合があります。

use Modern::Perl;

my $current_queue;
my $in_callers = 0;
while (<DATA>)
{
    if (!defined $current_queue)
    {
         /(\d{4}\*\d{3})/ and $current_queue = $1; 
    }
    elsif (!$in_callers)
    {
        /Callers:/ and $in_callers++;
    }
    elsif (/^\s*(\d+)\..*wait:\s+(\d+:\d+),\s+prio:\s+(\d+)/)
    {
        say "$current_queue,$1,$2,$3";
    }
    else
    {
        #end of this queue; reset.
        undef $current_queue; $in_callers = 0; 
    }
}

__DATA__
Parsing /etc/asterisk/extconfig.conf
0009*007 has 2 calls (max unlimited) in 'ringall' strategy
   Members: 
      0009*001 (Local/0009*001@queue/nj) (In use) has taken no calls yet
   Callers: 
      1. SIP/chan5-000a29f2 (wait: 0:08, prio: 0)
      2. SIP/0139*741-000a29f7 (wait: 0:03, prio: 0)
于 2012-11-20T14:41:55.967 に答える