2014-05-22 5 views
0

로그를 포함하는 파일이 있는데,이 파일은 시스템 페이지에서 페이지 너비를 늘려서 수정할 수 없습니다. 남아있는 유일한 옵션은 파일에서 파일을 수집하고 파일을 편집하는 것입니다. Perl을 사용하여 로그 파일 포맷하기

cat failure.txt 

04-05-22 12:57:38 \GINGER.$VOLS01 COBULED.ROM.H01  005056 LDEV 0222 File 
            $VOLS01.STEPHAN.TABLED, has been stopped 
            due to a processing error. 
04-05-22 12:57:39 \GINGER.$VOLS02 COBULED.ROM.H01  005056 LDEV 0221 File 
            $VOLS02.STEPHAN.TABLED, has been altered 
            due to a processing error. 
04-05-22 12:57:40 \GINGER.$VOLS08 COBULED.ROM.H01  005056 LDEV 0216 File 
            $VOLS08.STEPHAN.TABLED, has been rolled back 
            due to a processing error. 

나는 간단한 펄 프로그램을 작성

open $read_failed_log, '<', failure.txt or die "Could not open due to $!"; 

    open $write_failed_log, '>', failure_formated or die "Could not open due to $!"; 


    while($x = <$read_failed_log>){ 

     if(grep /^\S/,$x){ 
      print $write_failed_log "\n";     
      print $write_failed_log $x; 
      }else{ 
       print $write_failed_log $x; 
      } 
      } 


    close $read_failed_log; 
    close $write_failed_log; 

그러나 다음과 같이는 원하는 출력을 제공하지 않습니다 원하는 출력 :

cat failure_formated.txt 

04-05-22 12:57:38 \GINGER.$VOLS01 COBULED.ROM.H01  005056 LDEV 0222 File $VOLS01.STEPHAN.TABLED, has been stopped due to a processing error. 
04-05-22 12:57:39 \GINGER.$VOLS02 COBULED.ROM.H01  005056 LDEV 0221 File $VOLS02.STEPHAN.TABLED, has been altered due to a processing error. 
04-05-22 12:57:40 \GINGER.$VOLS08 COBULED.ROM.H01  005056 LDEV 0216 File $VOLS08.STEPHAN.TABLED, has been rolled back due to a processing error. 

은 일반적으로 무엇을 필요로하는 것은입니다 로그 라인이 끊어져서는 안됩니다. 각 로그 항목은 failure_formated.txt가 위에 표시된 것처럼 한 줄에 있습니다.

+0

아직도 줄 바꿈을하고있는 것 같습니다. newline을 제거하기 위해'chomp $ x; '를 써 보았습니까? – AntonH

+0

어딘가에'chomp $ x'가 필요하지 않습니까? –

+0

고마워 .. 네 .. 지금은 ... chomp를 추가 한 후 ... – May

답변

1

줄 바꿈을하고, 줄 시작 부분에 1을 넣습니다.

while (my $x = <$read_failed_log>) { 
    chomp($x); 
    $x =~ s/^(?=\d)/\n/; 
    print $write_failed_log $x; 
} 

한 줄,

perl -pe 'chomp; s/^(?=\d)/\n/' failure.txt > failure_formated 
+0

시간 내 주셔서 감사합니다 ... 지금 작동합니다 ... – May

+0

예 이제 문제가 하나 있습니다 ... 거대한 공간이 있습니다 ... 거기에 휴식 시간 .. $ x = ~ s/\ s {3,}/\ s/gm 추가; 그게 .. .. 이제는 잘 작동 .. – May

0

chomp 수정에게 당신의 라인을 반환하지만, 주위에 래핑 그래서 당신은 필드의 두 사이에 공간의 수가 많다. 문자열의 일부를 트리밍 시도 (팁에 대한 mpapec의 답변을 @ 참조)는 하나 라이너 일 수 있습니다/인쇄를 분석하기 전에 데이터 파일이 방법을 청소

open $read_failed_log, '<', "failure.txt" or die "Could not open: $!";  
open $write_failed_log, '>', "failure_formated" or die "Could not open: $!"; 

while(my $x = <$read_failed_log>){ 
    chomp $x;   # chomp the lines being read 
    $x =~ s/ {35}//gm; # remove blocks of > 35 white spaces 
    if(grep /^\S/,$x){ 
     print $write_failed_log "\n"; 
     print $write_failed_log $x;  
     } 
     else 
     {                  
      print $write_failed_log $x;           
     }                  
}                  

close $read_failed_log;               
close $write_failed_log; 

(아래 .e.g 참조). 희망이 도움이됩니다.

+0

시간 내 주셔서 감사합니다 .. – May

관련 문제