perl - 逐行比较两个日志文件并打印差异
问题描述
我必须逐行比较两个不同的日志文件(在每行中两个符号(:
和;
)之间的数据要检查)并打印日志 1 中不在日志 2 中的所有行。我使用了这种方法,但结果是不正确。
log1 中的内容:
INFO @0 digrf_0_drv: Constructing a digrf Driver: digrf_0_drv; T=0
INFO @648647 mti_disable_fuse_cov_inst: run_stimulus called; T=648647
INFO @1549325 mti_disable_fuse_cov_inst: CHECKING MTI DISABLE FUSE CONNECTED TO flash_mti_en; T=1549325
INFO @1549325 mti_disable_fuse_cov_inst: MTI_DISABLE fuse is correctly asserted ; T=1549325
日志2中的内容:
UVM_INFO @1381068 mti_disable_fuse_cov [mti_disable_fuse_cov:INFO]: CHECKING MTI DISABLE FUSE CONNECTED TO flash_mti_en; T=1381068
UVM_INFO @1381068 mti_disable_fuse_cov [mti_disable_fuse_cov:INFO]: MTI_DISABLE fuse is correctly asserted ; T=1381068
UVM_INFO @1381068 reporter [Z7_COREB]: V FLAG_CLEAR: Clearing flag 1; T=1381068
UVM_INFO @1381068 reporter [Z4_COREA]: V FLAG_SET: Setting flag 2; T=1381068
预期输出:
Constructing a digrf Driver: digrf_0_drv
run_stimulus called
现在我当前的代码是:
#!/usr/bin/perl
use strict;
use warnings;
#use 5.012;
my $filename1 = 'log2';
my %a_links;
open(FILE, $filename1) or die "Could not read from $filename1, program halting.";
while(<FILE>)
{
chomp;
my @fields1 = split(/[:;]/, $_);
$a_links{$fields1[1]} = undef;
}
close FILE;
my $filename2 = 'log1';
my @fields;
open(FILE, $filename2) or die "Could not read from $filename2, program halting.";
while(<FILE>)
{
chomp;
@fields = split(/[:;]/, $_);
next if exists $a_links{$fields[1]};
print "$fields[1] \n";
}
close FILE;
编辑
如果两行或多行在日志 1 中具有相同的信息集,则在输出中仅打印单行。
日志 1
INFO @0 digrf_0_drv: Constructing a digrf Driver: digrf_0_drv; T=0
INFO @603845 mcPWM_CYC: ----- SV is waiting for FLAG 4 -----; T=603845
INFO @1116033 mcPWM_CYC: ----- SV is waiting for FLAG 0 -----; T=1116033
INFO @1145215 mcPWM_CYC: ----- Flag 0 OK SV STARTED -----; T=1145215
INFO @1145215 mcPWM_CYC: PORT STIM started !!!; T=1145215
INFO @1145287 mcPWM_CYC: ----- SV is waiting for FLAG 2 -----; T=1145287
INFO @1146281 mcPWM_CYC: ----- Flag 0 OK : SV STARTED -----; T=1146281
INFO @1146281 mcPWM_CYC: PORT STIM started !!!; T=1146281
INFO @1190554 mcPWM_CYC: C-Code exit execution. code=<aa>; T=1190554
INFO @1190554 mti_lane1_bw_mon: total bytes = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane1_bw_mon: time window = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane1_bw_mon: BW in Mbps = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane2_bw_mon: total bytes = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane2_bw_mon: time window = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane2_bw_mon: BW in Mbps = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane3_bw_mon: total bytes = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane3_bw_mon: time window = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane3_bw_mon: BW in Mbps = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane4_bw_mon: total bytes = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane4_bw_mon: time window = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane4_bw_mon: BW in Mbps = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane5_bw_mon: total bytes = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane5_bw_mon: time window = 0, at time = 1190554; T=1190554
INFO @1190554 mti_lane5_bw_mon: BW in Mbps = 0, at time = 1190554; T=1190554
INFO: Report(s) of this encapsulation run can be found under:
日志2:
UVM_INFO @1353514 reporter [Z7_COREA]: mcPWM0_ExtSig: *** START Syncronization with Verilog Stimulus ***; T=1353514
UVM_INFO @1353578 reporter [Z7_COREA]: C FLAG_SET: Setting flag 0; T=1353578
UVM_INFO @1353578 reporter [Z7_COREA]: V FLAG_WAIT: Received flag 0; T=1353578
UVM_INFO @1353578 reporter [testbench.top_level_module.\mcPWM_CYC::main ]: ----- Flag 0 OK SV STARTED -----; T=1353578
UVM_INFO @1353578 reporter [testbench.top_level_module.\mcPWM_CYC::main ]: PORT STIM started !!!; T=1353578
UVM_INFO @1353642 reporter [Z7_COREA]: C FLAG_WAIT: Checking flag 1, status is 0; T=1353642
UVM_INFO @1353650 reporter [Z7_COREA]: V FLAG_SET: Setting flag 1; T=1353650
UVM_INFO @1353650 reporter [testbench.top_level_module.\mcPWM_CYC::main ]: ----- SV is waiting for FLAG 2 -----; T=1353650
UVM_INFO @1353650 reporter [Z4_COREA]: V FLAG_WAIT: Checking flag 2, status is 0; T=1353650
UVM_INFO @1353743 reporter [Z7_COREA]: C FLAG_WAIT: Checking flag 1, status is 1; T=1353743
UVM_INFO @1354063 reporter [Z7_COREA]: REM16: A=fbc00086 R=0007 E=0007 M=ffff; T=1354063
UVM_INFO @1354336 reporter [Z7_COREA]: REM16: A=fbc00080 R=048e E=048e M=ffff; T=1354336
UVM_INFO @1354532 reporter [Z7_COREA]: W16: A=fbc00080 W=008d; T=1354532
UVM_INFO @1354597 reporter [Z7_COREA]: C FLAG_SET: Setting flag 2; T=1354597
UVM_INFO @1354597 reporter [Z7_COREA]: V FLAG_WAIT: Received flag 2; T=1354597
UVM_INFO @1354597 reporter [testbench.top_level_module.\mcPWM_CYC::main ]: ----- Flag 0 OK SV STARTED -----; T=1354597
UVM_INFO @1354597 reporter [testbench.top_level_module.\mcPWM_CYC::main ]: PORT STIM started !!!; T=1354597
UVM_INFO @1354597 reporter [Z7_COREA]: V FLAG_WAIT: Received flag 2; T=1354597
UVM_INFO @1354597 reporter [Z7_COREA]: V FLAG_WAIT: Checking flag 2, status is 1; T=1354597
UVM_INFO @1354661 reporter [Z7_COREA]: C FLAG_WAIT: Checking flag 2, status is 1; T=1354661
UVM_INFO @1354741 reporter [Z7_COREA]: V FLAG_CLEAR: Clearing flag 2; T=1354741
UVM_INFO @1354741 reporter [Z4_COREA]: V FLAG_SET: Setting flag 5; T=1354741
UVM_INFO @1354741 reporter [Z7_COREA]: V FLAG_WAIT: Received flag 2; T=1354741
预期输出:
Constructing a digrf Driver: digrf_0_drv
----- SV is waiting for FLAG 4 -----
----- SV is waiting for FLAG 0 -----
C-Code exit execution. code=<aa>
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554
Report(s) of this encapsulation run can be found under
EDIT2 附带的输出:
Constructing a digrf Driver
----- SV is waiting for FLAG 4 -----
----- SV is waiting for FLAG 0 -----
----- Flag 0 OK SV STARTED -----
PORT STIM started !!!
----- SV is waiting for FLAG 2 -----
----- Flag 0 OK
PORT STIM started !!!
C-Code exit execution. code=<aa>
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554
Report(s) of this encapsulation run can be found under
EDIT3 附带的输出:
Constructing a digrf Driver
----- Flag 0 OK
C-Code exit execution. code=<aa>
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554
Report(s) of this encapsulation run can be found under
解决方案
试试这个命令行 perl
perl -F"/[:;]/" -lane ' $i=$ARGV eq "log1.txt" ? 1 : 2;$F[$i]=~s/^\s*|\s*$//g;
$kv{$F[$i]}=$ARGV ; END { for(keys %kv) { print "$_" if $kv{$_} eq "log1.txt" } } '
使用您给定的输入:
$ cat log1.txt
INFO @0 digrf_0_drv: Constructing a digrf Driver: digrf_0_drv; T=0
INFO @648647 mti_disable_fuse_cov_inst: run_stimulus called; T=648647
INFO @1549325 mti_disable_fuse_cov_inst: CHECKING MTI DISABLE FUSE CONNECTED TO flash_mti_en; T=1549325
INFO @1549325 mti_disable_fuse_cov_inst: MTI_DISABLE fuse is correctly asserted ; T=1549325
$ cat log2.txt
UVM_INFO @1381068 mti_disable_fuse_cov [mti_disable_fuse_cov:INFO]: CHECKING MTI DISABLE FUSE CONNECTED TO flash_mti_en; T=1381068
UVM_INFO @1381068 mti_disable_fuse_cov [mti_disable_fuse_cov:INFO]: MTI_DISABLE fuse is correctly asserted ; T=1381068
UVM_INFO @1381068 reporter [Z7_COREB]: V FLAG_CLEAR: Clearing flag 1; T=1381068
UVM_INFO @1381068 reporter [Z4_COREA]: V FLAG_SET: Setting flag 2; T=1381068
$ perl -F"/[:;]/" -lane ' $i=$ARGV eq "log1.txt" ? 1 : 2;$F[$i]=~s/^\s*|\s*$//g;
$kv{$F[$i]}=$ARGV ; END { for(keys %kv) { print "$_" if $kv{$_} eq "log1.txt" } } ' log1.txt log2.txt
Constructing a digrf Driver
run_stimulus called
$
编辑:
要按顺序打印,请使用
perl -F"/[:;]/" -lane ' $i=$ARGV eq "log1.txt" ? 1 : 2;$F[$i]=~s/^\s*|\s*$//g;
$kv{$F[$i]}=$ARGV ;push(@f,$F[$i]) ; END { for(@f) { print "$_" if $kv{$_} eq "log1.txt" } } ' log1.txt log2.txt
编辑2:
perl -F"/[:;]/" -lane ' $i=$ARGV eq "log1.txt" ? 1 : 2;$F[$i]=~s/^\s*|\s*$//g;
$kv{$F[$i]}=$ARGV ;push(@f,$F[$i]) ; END { for(@f) { print "$_" if $kv{$_} eq "log1.txt" } } ' log1.txt log2.txt | perl -0777 -pe ' s/(^total.*)\1//gms '
编辑3
perl -F"/[:;]/" -lane ' $i=$ARGV eq "log1.txt" ? 1 : $#F-1; $F[$i]=~s/^\s*|\s*$//g;
$kv{$F[$i]}=$ARGV ;push(@f,$F[$i]) ; END { for(@f) { print "$_" if $kv{$_} eq "log1.txt" } } ' log1.txt log2.txt | perl -0777 -pe ' s/(^total.*)\1//gms '
编辑4:
该解决方案完全不同,以满足预期的输出
$ perl -lne ' s!:\s+(.+?)\s*(;|:$)!$x=$1;$x=~s/: //g;$kv{$x}=$ARGV!e;push(@f,$x); END { for(@f) { print "$_" if $kv{$_} eq "log1.txt" } } ' log1.txt log2.txt | perl -0777 -pe ' s/(^total.*)*(?=\1)//gms'
Constructing a digrf Driverdigrf_0_drv
----- SV is waiting for FLAG 4 -----
----- SV is waiting for FLAG 0 -----
C-Code exit execution. code=<aa>
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554
Report(s) of this encapsulation run can be found under
$
注意事项:
----- Flag 0 OK : SV STARTED ----- => log1.txt
----- Flag 0 OK SV STARTED ----- => log2.txt
以上两行完全不同,所以我必须在替换过程中删除“:”以匹配并消除它们以获得所需的输出
log1.txt 中的最后一行
INFO: Report(s) of this encapsulation run can be found under:
没有分号,所以我|:$
在正则表达式匹配中进行了调整。
希望这可以帮助
推荐阅读
- java - 装饰器 + 状态模式:如果我正在装饰的方法取决于对象的状态怎么办?
- mysql - AWS RDS MySql 使用复合索引和日期范围的简单查询在大约 800 万个数据中执行时间过长
- python - 尝试将二进制转换为十进制:以奇怪的 int 错误结束?
- python - 无法在 Jenkins 中将 Python 脚本作为作业执行
- regex - 如何通过正则表达式匹配任意长度的数字序列?
- python - 在 Mac 上为 pycharm 安装 numpy
- database - 来自 Gsheet 文件的 Google Apps 脚本代码复制粘贴问题
- c++ - 将字符串存储到二维字符数组
- python - 添加矩阵时的奇怪行为
- nginx - nginx.conf 文件未使用 consul 更新服务发现的最新服务信息