修剪perl中的文本

时间:2014-10-07 19:46:41

标签: perl

我有一个文件格式如下:

Timeticks: (243749689) 28 days, 5:04:56.89
OID: .1.3.6.1
STRING: "07/10/14 - 16:36:50"
Hex-STRING: 09 15
INTEGER: 2
STRING: "STR:/storage0/Alarm/process/2/sentence xxxx"
STRING: "storage0"
STRING: "23250002"
STRING: "4039209"
INTEGER: 0
IpAddress: 172.17.1.41
STRING: "public"
OID: .1.3.6.1

我正试图修剪这些信息,但我无法完成这项工作。

我需要像这样修剪信息:

Date: 07/10/14 - 16:36:50
Process: process
Priority: 2
Sentence: sentence xxxx
Comunity: public

我试图像那样出星:

    foreach my $x (@varbinds)
    {
            next if ($x =~ /^Timeticks:/);
            next if ($x =~ /^OID:/);
            next if ($x =~ /^Hex-STRING:/);
            printf OUTPUT_FILE "%s\n", $x->[1];
    }

有人可以帮我一把吗?


更新

这是我的结构

my (@varbinds) = @{$_[1]};

unless (sysopen(OUTPUT_FILE, $SNMPTrapperFile, O_WRONLY|O_APPEND|O_CREAT, 0666))

foreach my $x (@varbinds) {
  next if ($x->[1] =~ m/Timeticks/);
  next if ($x->[1] =~ m/Integer/);
  if ($x->[1] =~ /^STRING/) {
    printf OUTPUT_FILE "%s\n", $x->[1];
  }
}

close (OUTPUT_FILE);

正确,这就是给我输出:

08/10/14 - 12:10:20
STR:/storage0/Alarm/process/2/sentence xxxx"
storage0
23250002
4065151
public

使用foreach的结构,我怎么格式化?

1 个答案:

答案 0 :(得分:2)

这是一个解决方案,它从DATA文件句柄读取所有信息并将其作为单个块处理。它期望在文件中只找到一组数据,并且感兴趣的行是以STRING:开头的第一行,第二行和第六行。辅助信息取自 second 此行的最后三个字段,当它在斜杠字符/上拆分时。

如果您希望从命令行中指定的特定文件中读取,则应使用<>而不是<DATA>进行阅读。如果您想对文件的路径进行硬编码,那么您需要调用open,就像这样

open my $fh, '<', 'myfile';

并使用open创建的文件句柄使用<$fh>而不是<DATA>从中读取。

use strict;
use warnings;
use 5.010;

my $data = do {
  local $/;
  <DATA>;
};

my @strings = $data =~ /^STRING\s*:\s*"([^"]*)/mg;
my @fields = split qr|/|, $strings[1];

printf "Date: %s\n",      $strings[0];
printf "Process: %s\n",   $fields[-3];
printf "Priority: %s\n",  $fields[-2];
printf "Sentence: %s\n",  $fields[-1];
printf "Community: %s\n", $strings[5];

__DATA__
Timeticks: (243749689) 28 days, 5:04:56.89
OID: .1.3.6.1
STRING: "07/10/14 - 16:36:50"
Hex-STRING: 09 15
INTEGER: 2
STRING: "STR:/storage0/Alarm/process/2/sentence xxxx"
STRING: "storage0"
STRING: "23250002"
STRING: "4039209"
INTEGER: 0
IpAddress: 172.17.1.41
STRING: "public"
OID: .1.3.6.1

<强>输出

Date: 07/10/14 - 16:36:50
Process: process
Priority: 2
Sentence: sentence xxxx
Comunity: public