2012-08-09 90 views
0

我是新來的Perl中,我們有類似以下日誌文​​件:Perl的 - 自定義日誌文件只顯示特定錯誤

SQL> @D:\Luntbuild_Testing\ASCMPK\Files\MAIN\DATABASE\HOST\FILES\DDL\20120412_152632__1_CLTM_EVENT_ACC_ROLE_BLOCK.DDL 
SQL> CREATE TABLE CLTM_EVENT_ACC_ROLE_BLOCK 
    2 (
    3 EVENT_CODE VARCHAR2(4) , 
    4 ACC_ROLE VARCHAR2(20) 
    5 ) 
    6 ; 
CREATE TABLE CLTM_EVENT_ACC_ROLE_BLOCK 
      * 
ERROR at line 1: 
ORA-00955: name is already used by an existing object 


SQL> @D:\Luntbuild_Testing\ASCMPK\Files\MAIN\DATABASE\HOST\FILES\DDL\20120412_173845__2_CLTM_EVENT_ACC_ROLE_BLOCK.DDL 
SQL> DROP TABLE CLTM_EVENT_ACC_ROLE_BLOCK; 

Table dropped. 

現在我需要一個腳本僅顯示有ORA-腳本路徑XXX錯誤,腳本應該只顯示SQL> @D:\ Luntbuild_Testing \與ORA-xxx錯誤關聯的路徑,我已經在下面嘗試過了,請你幫我加強一下。

$file = 'c:\data.txt'; 
open(txt, $file); 
while($line = <txt>) { 
print "$line" if $line =~ /> @/; #here i want the output to display the path of the script with only ORA-xxx errors and ignore if there are no errors 
print "$line" if $line =~ /ORA-/; 
} 
close(txt); 
+0

這將是巨大的,如果你的表演準確輸入所需的輸出。 – 2012-08-09 10:13:42

+0

輸入將是從日誌文件如上所示,我將讀取日誌文件, 輸出我需要的是如下 SQL> @D:\ Luntbuild_Testing \ ASCMPK \文件\ MAIN \ DATABASE \ HOST \ FILES \ DDL \ 20120412_152632__1_CLTM_EVENT_ACC_ROLE_BLOCK .DDL ORA-00955:名稱已經由現有對象 SQL> @D:\ Luntbuild_Testing \ ASCMPK \文件\升級-腳本\ POST_113 \典型\ misd_typ.sql ORA-02303:不能刪除或替換鍵入類型或表格依賴項 – user1587062 2012-08-09 10:20:22

回答

1

而不是立即打印線,當你看到> @標記,將其存儲在一個變量,只有把它打印出來,如果當你真正看到一個錯誤:

$file = 'c:\data.txt'; 
open(txt, $file); 
while($line = <txt>) { 
$fn = $line if $line =~ /> @/; #here i want the output to display the path of the script with only ORA-xxx errors and ignore if there are no errors 
print $fn, $line if $line =~ /ORA-/; 
} 
close(txt); 

另外:這是在腳本頂部寫上use strict;use warnings;的良好做法。 use strict;強制您使用my明確地命名您的本地變量,由於拼寫錯誤,它會捕獲很多錯誤。

1

我會做非常類似的東西給你試了一下:

$file = 'c:\data.txt'; 
open(F, $file); 
my $last_cmd = ''; 
while (<F>) { 
    $last_cmd = $_ if /^SQL\> \@D:/; 
    print $last_cmd if /^ORA-/; 
} 
+0

非常感謝您的幫助 – user1587062 2012-08-13 07:14:59