2010-07-29 40 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 
相關問題