2010-07-29 18 views
1

START如何收集两个关键词之间的界限?

Length: 1432 

    RIdentifier: 4 

    VIdentifier: 4 

    Format: 5 

    TS number: 9 

    DHeader 

    Version  = 1 
    Length   = 1432 
    Command Flags = RPT (0xd0) 
    Command Code = Accounting-Request (271) 
    Application Id = Rf-Application (3) 
    Hop By Hop Id = 51 
    End To End Id = 8847360 

START 

    Length: 12 

    RIdentifier: 2 

    VIdentifier: 4 

    Format: 5 

    TS number: 6 

    DHeader 

    Version  = 1 
    Length   = 1432 
    Command Flags = RPT (0xd0) 
    Command Code = Accounting-Request (271) 
    Application Id = Rf-Application (3) 
    Hop By Hop Id = 51 
    End To End Id = 8847360 

START 

我需要收集那些START之间找到的所有行,并将其写入2个文件。 我与触发器试图在Perl一样:

open(FILE, $ARGV[0]); 
while (<FILE>) { 
    if (/START/ .. /START/) { 
     print "$. $_ \n"; 
    } 
} 

但我只得到有START线。你可以帮我吗?

回答

0

如果Perl是不是必须的,

$ awk -vRS="START" 'NF{ print $0 > ++c".txt" }' file 
+0

但我需要在Perl。这是脚本的一部分... – ram 2010-07-29 15:00:23

1

...

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

my $output; 
while(<DATA>) { 
    if(/START/) { 
    if(defined $output) { 
     print $output; 
     $output = ''; 
     print "="x80,"\n"; 
    } 
    next; 
    } else { 
    $output .= $_; 
    } 
} 

__DATA__ 
START 

Length: 1432 

RIdentifier: 4 

VIdentifier: 4 

Format: 5 

TS number: 9 

DHeader 

Version  = 1 
Length   = 1432 
Command Flags = RPT (0xd0) 
Command Code = Accounting-Request (271) 
Application Id = Rf-Application (3) 
Hop By Hop Id = 51 
End To End Id = 8847360 

START 

Length: 12 

RIdentifier: 2 

VIdentifier: 4 

Format: 5 

TS number: 6 

DHeader 

Version  = 1 
Length   = 1432 
Command Flags = RPT (0xd0) 
Command Code = Accounting-Request (271) 
Application Id = Rf-Application (3) 
Hop By Hop Id = 51 
End To End Id = 8847360 

START 

输出:

Length: 1432 

RIdentifier: 4 

VIdentifier: 4 

Format: 5 

TS number: 9 

DHeader 

Version  = 1 
Length   = 1432 
Command Flags = RPT (0xd0) 
Command Code = Accounting-Request (271) 
Application Id = Rf-Application (3) 
Hop By Hop Id = 51 
End To End Id = 8847360 
================================================================================ 

Length: 12 

RIdentifier: 2 

VIdentifier: 4 

Format: 5 

TS number: 6 

DHeader 

Version  = 1 
Length   = 1432 
Command Flags = RPT (0xd0) 
Command Code = Accounting-Request (271) 
Application Id = Rf-Application (3) 
Hop By Hop Id = 51 
End To End Id = 8847360 
================================================================================ 
+0

没有纨绔子弟。两个关键词是一样的。问题就在于此。基本上我需要提取两个相同的关键字之间找到的行。 – ram 2010-07-29 15:03:15

+0

好的,我已更新。 – Toto 2010-07-29 15:10:45

0

您使用的是START线条作为分隔符,让你”我们需要用Perl的$/来抽一点,这是一个记录分隔符

#! /usr/bin/perl 

use warnings; 
use strict; 

sub usage { "Usage: $0 input output ..\n" } 

die usage unless @ARGV >= 1; 
my $input = shift; 

my $pid = open my $out, "|-"; 
die "$0: fork: $!" unless defined $pid; 

if ($pid == 0) { # child 
    if (@ARGV) { 
    open STDOUT, ">", "/dev/null" or warn "$0: open: $!"; 
    } 
    exec "tee", @ARGV or die "$0: exec: $!"; 
} 

$/ = "START\n"; 

open my $in, "<", $input or die "$0: open: $!"; 
my $i = 1; 
while (<$in>) { 
    chomp; 
    next unless /\S/; 
    print $out "$i. $_\n"; 
    ++$i; 
} 

在命令行上没有命名输出的情况下,上面的代码会将记录发送到标准输出。否则,它会将所有的输出放大,其中可以任意多。

0

split功能会帮助你,就像

#!/usr/bin/perl 
    use strict; 
    use warning; 
    open(IN, '<', $ARGV[0]) or die $!; 
    read(IN, my $data, -s $ARGV[0]); 
    my @test = split(/START/, $data); 
    shift(@test); #removing first element of array 
    foreach my $test(@test){ 
    print"Records:$test\n"; 
    } 

输出

Records: 
    Length: 1432 

     RIdentifier: 4 

     VIdentifier: 4 

     Format: 5 

     TS number: 9 

     DHeader 

     Version  = 1 
     Length   = 1432 
     Command Flags = RPT (0xd0) 
     Command Code = Accounting-Request (271) 
     Application Id = Rf-Application (3) 
     Hop By Hop Id = 51 
     End To End Id = 8847360 


Records: 
    Length: 12 

     RIdentifier: 2 

     VIdentifier: 4 

     Format: 5 

     TS number: 6 

     DHeader 

     Version  = 1 
     Length   = 1432 
     Command Flags = RPT (0xd0) 
     Command Code = Accounting-Request (271) 
     Application Id = Rf-Application (3) 
     Hop By Hop Id = 51 
     End To End Id = 8847360 
相关问题