2015-10-26 55 views
0

我從看起來像這樣的一個日誌文件中讀取:從文件讀取/寫入;與線相結合匹配行後

[2007/09/06 10:49:30, 0] lib/util_sock.c:write_data(562) 
    write_data: write failure in writing to client 158.136.148.93. Error Connection reset by peer 
[2007/09/06 10:49:30, 0] lib/util_sock.c:send_smb(769) 
    Error writing 4 bytes to client. -1. (Connection reset by peer) 
[2007/09/06 10:49:30, 1] smbd/service.c:make_connection_snum(950) 
    pubcen04 (158.136.156.79) connect to service sfengel initially as user sfengel (uid=18375, gid=122) (pid 5044) 

如果一個條目包含make_connnection或close_cnum我正在寫進入所謂的data.txt另一個文件。所以,當我的程序匹配一條線時,它匹配make_connection所在的那一行,但我也需要直接在它下面一行的信息。我最近的嘗試是通過使用連接功能,但它似乎並沒有工作。

代碼這裏:

#! /usr/bin/perl 
use strict; 
use warnings; 
use IO::File; 

my $logfile = 'log.smbd'; 
my $cnt; 

open(my $info, '<', $logfile) 
     or die "Could not open file '$logfile' $!"; 

while(my $line = <$info>) { 
     if(index($line, 'make_connection' || 'close_cnum') != -1) { 
       chomp($line); 
       $line = join(" ",(<$info> =~ /(\w+)\s+(\w+)/))."\n"; 
       $line =~ s/\[//g; 
       $line =~ s/\]//g; 
       my @array = split//, $line; 
       open(my $fh, '>>/etc/data.txt'); 
         print ($fh "\"$array[0]\"\,", "\"$array[1]\"\,",\"$array[5]\"\,"); 
     } 
} 
+1

設置$ /爲[然後它應該工作。 – Sobrique

+0

歡迎來到Stack Overflow?請儘快閱讀[關於]頁面。怎麼了?你爲什麼不展示會發生什麼?我最好的猜測是'join'的第二個參數可能是一個列表上下文,列表上下文中的<>'會讀取整個文件。不要像那樣亂七八糟Perl有咬你的方法。明確閱讀額外的行。 –

+0

索引看起來是這裏的罪魁禍首。 ||看起來並不像你想象的那樣。 – Sobrique

回答

-1

你這樣做,你需要更強硬的方式。第一關:

if(index($line, 'make_connection' || 'close_cnum') != -1) { 

是不會做你認爲它可能 - 這||是更嚴格的約束力比你想象的 - 所以你不會被測試在所有「close_cnum」。

A || B 

總是返回「A」,如果它是真的,則返回「B」,如果不是。 'make_connection'不是空字符串或零,所以它是「真」。

我建議這樣的事情,而不是:

#!/usr/bin/env perl 
use strict; 
use warnings; 

local $/ = "\n["; 

while (<DATA>) { 
    next unless m/(make_connection|close_cnum)/; 
    my ($date, $time, $call, $error_text) = m/^([\d\/]+) ([\d\:]+). \d+\] (\S+)\n\s*(.*)/m; 
    print "Date = $date\n"; 
    print "time = $time\n"; 
    print "call = $call\n"; 
    print "Error = $error_text\n"; 
    print "Full record:\n"; 
    print; 
    print "\n---\n"; 
} 

__DATA__ 
[2007/09/06 10:49:30, 0] lib/util_sock.c:write_data(562) 
    write_data: write failure in writing to client 158.136.148.93. Error Connection reset by peer 
[2007/09/06 10:49:30, 0] lib/util_sock.c:send_smb(769) 
    Error writing 4 bytes to client. -1. (Connection reset by peer) 
[2007/09/06 10:49:30, 1] smbd/service.c:make_connection_snum(950) 
    pubcen04 (158.136.156.79) connect to service sfengel initially as user sfengel (uid=18375, gid=122) (pid 5044) 
  • 我們通過DATA迭代 - 這是一個特殊的文件句柄,你可以用你的<$info>代替。 (這是測試)

  • 但是因爲我們已經設置$/[它將文件分割成塊,並通過它們工作。

  • $_設置爲當前塊的內容,並對其應用模式匹配以提取所需的文本。 (注意 - 默認情況下,模式匹配適用於$_,這很有用)。

恐怕我不能告訴你,旨在趕上與$array[5]什麼,所以我已經猜到。但你應該能夠知道那裏發生了什麼。