2012-06-06 101 views
2

好吧,我需要讀入一個文件,遍歷每一行並找到字符串ERROR。這是我到目前爲止:在Perl上搜索文件

open(LOGFILE, "input.txt") or die "Can't find file"; 

$title = <LOGFILE>; 

$\=' ' ; 
while (<>){ 
    foreach $title(split){ 
     while (/^ERROR/gm){ 
      print "ERROR in line $.\n"; 
     } 
    } 
} 
close LOGFILE; 

所以我的問題是,它只看每行的第一個字。所以如果輸入是

boo far ERROR

它不會註冊錯誤。任何幫助將不勝感激!我是Perl的新手,所以請儘量保持基本的東西。謝謝!

+1

這聽起來像'grep'的工作:'grep -n ERROR input.txt'。 – TLP

+0

@TLP絕對是最好的方法。如果你願意,隨意添加一個編輯到我的答案。 – kevlar1818

+1

@ kevlar1818這取決於OP所使用的操作系統。我覺得它比回答更適合作爲評論。 – TLP

回答

6

這是一個更優雅的方法,我修復了正則表達式問題。 ^匹配一行的開始。

open(LOGFILE, "input.txt") or die "Can't find file"; 

while(<LOGFILE>) { 
    print "ERROR in line $.\n" if(/ERROR/); 
} 
close LOGFILE; 

或者怎麼樣的命令行:

perl -n -e 'print "ERROR in line $.\n" if(/ERROR/);' input.txt 

-n隱式循環輸入 -e的所有行執行的代碼行

要輸出到文件:

perl -n -e 'print "ERROR in line $.\n" if(/ERROR/);' input.txt > output.txt 

雖然這是一個使用Perl,如果你使用的是Unix外殼的良好/簡單的例子,grep你想要做什麼,無需腳本(在OP評論感謝TLP):

grep -n ERROR input.txt > output.txt 

這實際上是打印匹配用自己的行號排隊。

+0

完美!非常感謝!現在我需要將它寫入文件哪些行有錯誤。我熟悉Python,所以Perl對我來說是新的。 – user1440061

+0

如果這個工作,可以隨時接受它,或至少+1 :-)。 – kevlar1818

+0

我還無法對它進行+1,因爲我的聲望尚未達到15。但是謝謝你! – user1440061

1

當然,它不會,因爲^在你的正則表達式意味着「開始行」。刪除它,它會在任何地方捕獲錯誤。你也不應該做任何分裂的技巧。你需要在任何地方找到錯誤?然後只寫如下:

while (<>){ 
    if (/ERROR/){ 
     print "ERROR in line $.\n"; 
    } 
} 
+0

好的!因此,我刪除了^,但現在即使只有一個錯誤,該消息也會打印多少次,因爲該行中有單詞。例如,即使錯誤只發現一次,故障條欄ERROR也會讓我在第1行發生錯誤四次。 – user1440061

+0

殺死'$ \ ='''也是如此。 –