こんにちは私はファイル内に複数の行を持ち、それらからユーザ名と彼が使用しているバージョンを取得できるようにしたいと考えています。Perl:ファイル検索の正規表現複数の情報を複数の行に入力する
ファイル
<W>2016-06-25 00:27:30.577 1 => <4:(-1)> Client version 1.2.10 (Win: 1.2.10)
<W>2016-06-25 00:27:30.635 1 => <4:[AAA] User1(1850)> Authenticated
<W>2016-06-25 00:27:30.635 1 => <2:(-1)> Client version 1.2.16 (Win: 1.2.16)
<W>2016-06-25 00:27:30.687 1 => <2:[AAA] User2(942)> Authenticated
Outpoutだから1つのクライアントの件のデータが2行にある
4 : User1 : 1.2.10
2 : User2 : 1.2.16
を望んでいました。
私の例では、両方の行に一致IDがあることに気付きました。私の例では、user1行の一致IDは4:2で、2番目のユーザーは2です。
私はこのようなことから始めましたが、実際に意図したとおりに動作せず、ファイル全体の2行目を見つけるために2番目の読み込みを作成すると、あまりにも多くの/最適化されていません。
のPerlスクリプト
#!/usr/bin/perl
use strict;
use warnings;
my $file = 'mylogfile.log';
open (my $fl, '<:encoding(UTF-8)', $file)
or die 'File not found';
while (my $row = <$fl>) {
if ($row =~ m/\<(\d+).*\>\sclient\sversion\s(\d+.\d+.\d+)\s/i) {
my $id = $1;
my $vers = $2;
while (my $row1 = <$fl>) {
if ($row1 =~ m/\<$id\:(.+)\(\d+\)\>/i) {
my $name = $1;
print "$id : $name : $vers\n";
}
}
}
}
任意のPerlの第一人者がアイデアを持っている場合は、ありがとう! :-)
また、phpでは、すべての検索を1行に変換するだけで簡単にできます。 s regex修飾子は良い正規表現と共に使用できます。しかし、perlはPHPで使用できるpreg_match_allとして動作しません:-( – flop