我有一个输出看起来像这样:使用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
我不认为你可以分割空白,因为“纽约”将不会被正确打印。看起来更像固定宽度的数据,这意味着正则表达式或者打包/解包。可能由制表符分隔。 – TLP