我有多个看起来像dmesg输出的日志文件。我需要解析并将所有这些文件中的某些结果存储到一个输出文件中。 Ex输入文件1:
.....
Started 1399343129
KbPerSec 1222
KiloBytes 9302938
Status 83
StorageUNit unitname
Ended 1399473434
.......
输出文件:
1399343129 1222 9302938 83 unitname 1399473434
<input file2 numbers>
<input file3 numbers>
.....
所以,我使用grep,并将grep结果拆分以获得我想要的数字。这是我的代码的样子。
<TRY>
是我的文件句柄。
my (@grepres, @splitres);
my ($size, $start, $bw);
if(@grepres=grep{/KbPerSec/} <TRY>){
@splitres=split(' ',$grepres[0]);
$bw=$splitres[1];
print "1. $bw\n";
}
if(@grepres=grep{/Started/} <TRY>){
@splitres=split(' ',$grepres[0]);
$start=$splitres[1];
print "$start\n";
}
...
答案 0 :(得分:1)
<TRY>
会占用TRY
文件句柄中的所有数据,因此对<TRY>
的后续调用将返回空。如果要重用文件流中的数据,一个。将流保存到变量
my @try = <TRY>;
if ( grep ..., @try ) {
...
}
if ( grep ..., @try ) {
...
}
湾重新打开文件或seek
回到开头
open TRY, '<', $try_file
...
if (grep ..., <TRY>) {
...
}
close TRY;
open TRY, '<', $try_file
if (grep ..., <TRY>) {
...
}
open TRY, '<', $try_file
...
if (grep ..., <TRY>) {
...
}
seek TRY, 0, 0; # reset cursor position to start of file
if (grep ..., <TRY>) {
...
}
答案 1 :(得分:1)
这是一种可能的方法,取决于从记录到记录的字段顺序相同。
更新:更改了结束条件匹配。
#!/usr/bin/perl
use strict;
use warnings;
my @data;
while (<DATA>) {
if (/^Started/ .. /^Ended/) {
push @data, /^\S+ (.+)$/;
print join(" ", splice @data), "\n" if /^Ended/;
}
}
__DATA__
.....
Started 1399343129
KbPerSec 1222
KiloBytes 9302938
Status 83
StorageUNit unitname
Ended 1399473434
.......
打印
1399343129 1222 9302938 83 unitname 1399473434