1

我想从 tcp 流文件中提取除 http 标头之外的内容,内容如下所示,当遇到两个 ^M 时,http 标头结束

HTTP/1.1 200 OK^M 
Last-Modified: Sat, 20 Mar 2010 09:43:12 GMT^M 
Content-Type: video/x-flv^M 
Date: Wed, 24 Oct 2012 14:34:13 GMT^M 
Expires: Wed, 24 Oct 2012 14:34:13 GMT^M 
Cache-Control: private, max-age=22124^M 
Accept-Ranges: bytes^M 
Content-Length: 29833281^M 
Connection: close^M 
X-Content-Type-Options: nosniff^M 
Server: gvs 1.0^M 
^M 
FLV^A^E^@^@^@   ^@^@^@^@^R^@^CK^@^@^@^@^@^@^@^B^@ 
onMetaData^H^@^@^@^O^@^Hduration^@@i<97> 
=p£×^@  starttime^@^@^@^@^@^@^@^@^@^@^Mtotalduration^@@i<97>

我的提取代码如下,我运行:extract.pl < tcp.flow 但似乎循环是无止境的,代码有什么问题?谢谢!

#!/usr/bin/perl 
$start=0; 
$data=""; 
while(<STDIN>) 
{ 
    if ( $start eq 0 && $_ =~ /^\r\n/) { $start = 1; } 
    elsif ( $start eq 1 ) { $data = $data . $_; } 
} 
open(FH, ">sample.flv"); 
print FH $data; 
close(FH);
4

2 回答 2

1

在读取数据之前调用binmode()STDIN,文件内容可能会干扰文件读取。在写入数据之前,您还需要在 FH 上使用它。高温高压

于 2012-10-24T20:44:26.907 回答
1

这是一个单行。但是,我认为没有任何无限循环的理由。

perl -00 -lne '$i++ and print' file > sample.flv

哪个 deparsed 看起来像这样:

>perl -MO=Deparse -00 -lne '$i++ and print' input.txt
BEGIN { $/ = ""; $\ = "\n\n"; }        # from -l and -00
LINE: while (defined($_ = <ARGV>)) {   # from -n
    chomp $_;                          # from -l, removes "\n\n" now
    print $_ if $i++;                  # skips the first line
}
-e syntax OK

如果您需要先清理文件,只需执行

perl -pi -le 's/[\r\n]+$//' input.txt
于 2012-10-24T21:33:40.370 回答