linux - 解析文件 perl

标签 linux perl parsing

这个程序实际上将 $rf_id、$date、$qf_id 和 $failure_msg 打印到一个文件中,问题是在获取第一个值时,它将 $rf_id 的值存储为 0,其余的值是根据需要打印的。rf_id 是 sumhow 在其他行中仅在第一行中设置为 0 就可以了。

#!/usr/bin/perl

use strict;
use warnings;

my $mailqdir = "/mail1.txt";
my $mqueue_directory = "/var/spool/mqueue/";
my $messages_removed = 0;
my $rf_id;
my $date;
my $temp;
my $tmp;
my @write_array;
my $to;
my $from;
my $subject;
my $path_to_sendmail = "/usr/sbin/sendmail -f";
my $mailsubject = "Subject: Deleted Queued Mails from LSMGR sendmail \n\n\n";

$ENV{"PATH"}="/usr/sbin/:/usr/sbin";
my $currentfile = `sendmail -bp`;
my $qf_id = 0;
my $failure_msg;
my $qf_file;
my $df_file;

open (MYFILE, ">/queue.txt");
print MYFILE "$currentfile";
close (MYFILE);
system("/etc/init.d/sendmail stop");
open(MYFILE,$mailqdir);
 while (<MYFILE>){
    if(/(?<=<)[^>]+(?=>\s*$)/g){
        $temp=$_;
        $temp =~ s/^\s+|s+$//g;
        $rf_id = "$temp";
        my $tmp = "$temp";
    }
    if (/(\w{14})/){
        $qf_id=$1;
        $qf_file = 'qf' . $1;
        $df_file = 'df' . $1;
        $date = substr($_,24,17);
        next unless /(\w{14})/;
        $temp = scalar <MYFILE>;   
        $temp =~ s/^\s+|s+$//g;
        $failure_msg=$temp;
    }
    push(@write_array,"$qf_file:$failure_msg:$date:$rf_id");
    $ENV{"PATH"}="/var/run/:/etc/rc.d/init.d/functions:/var/lock/subsys/:/etc/init.d/sendmail:/etc/init.d:/bin/:/usr/local/bin/:/var/spool/mqueue";
    print "Removing $qf_file... \n";
    print "Removing $df_file...\n";
    system ("rm $mqueue_directory$qf_file");
    system ("rm $mqueue_directory$df_file");
    $messages_removed++;
}
close (MYFILE);
open (CODE,">/mail.txt");
print CODE "@write_array";
close (CODE);
system("/etc/init.d/sendmail start");
$to='';
$from='';
$ENV{"PATH"}="/usr/sbin/:/usr/sbin";
#system ("$path_to_sendmail $from $to < /mail.txt");
print "\n$messages_removed total \"Deferred Mails\" message(s) removed from ";
print "mail queue.\n";
<小时/>

这是我想要解析的一种记录类型,这是示例之一:

  q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010408  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010409  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010410  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>

最佳答案

我无法重现您的问题。简化和修复后(不需要环顾四周,替换中的 s 之前缺少反斜杠)您的代码为

#!/usr/bin/perl

use strict;
use warnings;

my $temp;
my $rf_id;
my $failure_msg;
my $messages_removed;
my @write_array;

while (<DATA>){
    chomp;
    if(/<[^>]+>\s*$/g){
        $temp  = $_;
        $temp  =~ s/^\s+|\s+$//g;
        $rf_id = $temp;
    }
    my ($qf_file, $df_file, $date);
    if (/^(\w{14})/){
        $qf_file = 'qf' . $1;
        $df_file = 'df' . $1;
        $date = substr $_, 24, 17;
        next unless /(\w{14})/;
        $temp =  scalar <DATA>;
        $temp =~ s/^\s+|s+$//g;
        $failure_msg = $temp;
    }
    push(@write_array,"$qf_file:$failure_msg:$date:$rf_id\n");
    print "rm $qf_file $df_file\n";
    $messages_removed++;
}

print "\n\nCODE\n@write_array\n";
print "\n$messages_removed total \"Deferred Mails\" message(s) removed from ";
print "mail queue.\n";

__DATA__
q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010408  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010409  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010410  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>

我得到这个输出:

rm qfq2VDWKkY010407 dfq2VDWKkY010407
Use of uninitialized value $qf_file in concatenation (.) or string at 1.pl line 29, <DATA> line 3.
Use of uninitialized value $date in concatenation (.) or string at 1.pl line 29, <DATA> line 3.
Use of uninitialized value $qf_file in concatenation (.) or string at 1.pl line 30, <DATA> line 3.
Use of uninitialized value $df_file in concatenation (.) or string at 1.pl line 30, <DATA> line 3.
rm  
rm qfq2VDWKkY010408 dfq2VDWKkY010408
Use of uninitialized value $qf_file in concatenation (.) or string at 1.pl line 29, <DATA> line 6.
Use of uninitialized value $date in concatenation (.) or string at 1.pl line 29, <DATA> line 6.
Use of uninitialized value $qf_file in concatenation (.) or string at 1.pl line 30, <DATA> line 6.
Use of uninitialized value $df_file in concatenation (.) or string at 1.pl line 30, <DATA> line 6.
rm  
rm qfq2VDWKkY010409 dfq2VDWKkY010409
Use of uninitialized value $qf_file in concatenation (.) or string at 1.pl line 29, <DATA> line 9.
Use of uninitialized value $date in concatenation (.) or string at 1.pl line 29, <DATA> line 9.
Use of uninitialized value $qf_file in concatenation (.) or string at 1.pl line 30, <DATA> line 9.
Use of uninitialized value $df_file in concatenation (.) or string at 1.pl line 30, <DATA> line 9.
rm  
rm qfq2VDWKkY010410 dfq2VDWKkY010410
Use of uninitialized value $qf_file in concatenation (.) or string at 1.pl line 29, <DATA> line 12.
Use of uninitialized value $date in concatenation (.) or string at 1.pl line 29, <DATA> line 12.
Use of uninitialized value $qf_file in concatenation (.) or string at 1.pl line 30, <DATA> line 12.
Use of uninitialized value $df_file in concatenation (.) or string at 1.pl line 30, <DATA> line 12.
rm  


CODE
qfq2VDWKkY010407:(host map: lookup (my.local.domain): deferred)
:Sat Mar 31 19:37 :q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>
 :(host map: lookup (my.local.domain): deferred)
::<yagyavalkbhatt@yahoo.com>
 qfq2VDWKkY010408:(host map: lookup (my.local.domain): deferred)
:Sat Mar 31 19:37 :q2VDWKkY010408  2221878 Sat Mar 31 19:37 <Mailer-daemon>
 :(host map: lookup (my.local.domain): deferred)
::<yagyavalkbhatt@yahoo.com>
 qfq2VDWKkY010409:(host map: lookup (my.local.domain): deferred)
:Sat Mar 31 19:37 :q2VDWKkY010409  2221878 Sat Mar 31 19:37 <Mailer-daemon>
 :(host map: lookup (my.local.domain): deferred)
::<yagyavalkbhatt@yahoo.com>
 qfq2VDWKkY010410:(host map: lookup (my.local.domain): deferred)
:Sat Mar 31 19:37 :q2VDWKkY010410  2221878 Sat Mar 31 19:37 <Mailer-daemon>
 :(host map: lookup (my.local.domain): deferred)
::<yagyavalkbhatt@yahoo.com>


8 total "Deferred Mails" message(s) removed from mail queue.

请尝试解释一下您想要实现的目标。运行代码时,请注意收到的警告 - 您正在空文件名上运行 rm(可以用 Perl 的 unlink 替换)。

更新:疯狂猜测你可能在做什么:

#!/usr/bin/perl

use strict;
use warnings;

my %matched;
my @out;

while (<DATA>) {
    chomp;
    if (/^(?<id>\S{14})\s+
          (?<num>[0-9]+)\s+
          (?<day>...)\s+
          (?<month>...)\s+
          (?<monthday>[0-9]+)\s+
          (?<time>[0-9]+:[0-9]+)\s+
         <(?<from>.*)>/x) {
        %matched = %+;

    } elsif (/^\s+<(.*)>/) {
        $out[-1] .= ":$1";

    } elsif (s/^\s+\(/(/) {
        print "rm qf$matched{id} df$matched{id}\n";
        push @out, join ':', "qf$matched{id}",
                              $_,
                              join ' ',@matched{qw/day month monthday time/};

    } else {
        die "Cannot parse: $_\n";
    }
}

print "$_\n" for @out;
print scalar @out, " messages removed.\n";

__DATA__
q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010408  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010409  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
q2VDWKkY010410  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>

请注意,: 作为分隔符可能不是最佳选择:它会在消息中及时使用并两次使用。

关于linux - 解析文件 perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10876911/

相关文章:

java - InputMap - 注册一个监控按键的击键,没有虚拟重复

perl - 我如何从页面中提取所有链接,但不包括使用 Perl 的 WWW::Mechanize 的链接?

phpunit:是否有类似于 perl 的 Test::More::note() 和 Test::More::diag() 函数的函数?

java - 使用 Java 测试 Linux/Web 服务器环境的建议

xml - 如何在 perl 中进行验证

json - Perl 生成的 JSON 中的 UTF8 字符串在客户端损坏

c++ - LISP 解析器 C++

PHP 将 CSV 转换为特定的 JSON 格式

java - 将函数参数列表的字符串表示形式转换为实际参数,以进行反射调用

c++ - 如何分析静态/全局初始化?