2011-08-02 34 views
0

我有一个输出看起来像这样:使用printf的perl报告格式 - 跳过一些行。

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"; 
    } 

} 

我努力跳过开始和结束行 - 但他们打印出两次 - 我试过跳过B EGIN和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 
+0

我不认为你可以分割空白,因为“纽约”将不会被正确打印。看起来更像固定宽度的数据,这意味着正则表达式或者打包/解包。可能由制表符分隔。 – TLP

回答

1

你的第二个和第三个if S的关系是elsif;否则,BEGIN和END会在else子句中一次又一次地打印出来(因为那样会捕获所有不是OCOMsg2的东西)。

+0

是这样做的 - 我需要了解if elsif之间的区别。 – capser

1

添加next到处理配套BEGINEND块:

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

这将使它开始while循环的下一次迭代。

+0

这也起到了作用 - 我进去了(建议从以前的评论)if elsif的东西,而不是。 – capser