форматирование отчета perl с использованием printf - пропустить несколько строк. - PullRequest
0 голосов
/ 02 августа 2011

У меня есть вывод, который выглядит так:

BEGIN newcomm stat for rufarm102
__________________________________________________________________________________

ibfarm102 localtick     Boston       hibmis100 procHKHD2  Hongkong   PidMonRsp
ibfarm102 localtick     London       stopsrv1 proceu8  Zug   PidMonRsp
ibfarm102 localtick     Greenwich       hibmis100 procHKHD2  Hongkong   PidMonReq
ibfarm102 localtick     New York      stopsrv1 proceu8  Zug   PidMonReq

END : ibfarm102  newcomstat

и я запускаю его через этот скрипт:

#!/usr/bin/perl
open (REPORT , "/home/data/report20110801130041");
while (<REPORT>){
  if ($_ =~ /BEGIN/){
     print $_ ;
  }
  if ($_ =~ /END/){
     print $_;
  }
  if ($_ =~ /OCOMsg2/){
     use Term::ANSIColor;
     print color 'red';
     ($config_host , $config_process, $config_region, $stat_host, $stat_process, $stat_host_region, $stat_message_class) = split(/\s+/, $_ );
     printf "%-15s %-10s %10s %15s %-10s %-8s %10s", $config_host , $config_process, $config_region, $stat_host, $stat_process, $stat_host_region, $stat_message_class ;
     print color 'reset';
     print "\n";
  }
  else{
  ($config_host, $config_process, $config_region, $stat_host, $stat_process, $stat_host_region, $stat_message_class) = split(/\s+/, $_ );
  printf "%-10s %-10s %10s %15s %-10s %-8s %10s", $config_host , $config_process, $config_region, $stat_host, $stat_process, $stat_host_region, $stat_message_class ;
  print "\n";
  }

}

Я стараюсь пропустить строки BEGIN и END, но они выводятся дважды, и Я попытался пропустить начало и конец несколько раз, несколькими разными способами. Я не нужно, чтобы строки BEGIN и END были разделены и отформатированы в printf.

BEGIN newcomm stat for ibfarm102
BEGIN      newcomm          stat             for ibfarm102   

ibfarm102  localtick   Greenwich       hibmis100 procHKHD2  Hongkong  PidMonRsp
ibfarm102  localtick   Greenwich        stopsrv1 proceu8    Zug       PidMonRsp
ibfarm102  localtick   Greenwich       hibmis100 procHKHD2  Hongkong  PidMonReq
ibfarm102  localtick   Greenwich        stopsrv1 proceu8    Zug       PidMonReq

END : ibfarm102  newcomstat
END        :           ibfarm102      newcomstat

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Добавьте next в блоки, соответствующие BEGIN и END:

while(<REPORT>) {
    if (/BEGIN/) {
        print;
        next;
    }
...

Это заставит его начать следующую итерацию цикла while.

1 голос
/ 02 августа 2011

Ваш второй и третий if с должен быть elsif; в противном случае BEGIN и END печатаются один раз, а затем снова в предложении else (поскольку, как и все, что ловит все, что не является OCOMsg2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...