Perl—如何跳过先前处理中已读取的行

Perl—如何跳过先前处理中已读取的行,perl,skip,log-rotation,Perl,Skip,Log Rotation,我对下面的Perl程序有一个问题,它可以用来重新组织并执行对应用程序的访问跟踪 我已经用跳转行函数实现了以下解决方案,因为未来我可能会有10个或更多的旋转文件,每个文件50MB 我想跳过先前处理中已经读取的行(如果文件的inode没有更改),这样我将只处理delta 我希望这段代码可以帮助其他用户 #/usr/bin/perl 严格使用; 使用“全部”警告; 使用File::Path qw; 使用File::Spec; 使用文件::复制; 使用POSIXQW; 使用英语; #动态变量 我的%u计

我对下面的Perl程序有一个问题,它可以用来重新组织并执行对应用程序的访问跟踪

我已经用跳转行函数实现了以下解决方案,因为未来我可能会有10个或更多的旋转文件,每个文件50MB

我想跳过先前处理中已经读取的行(如果文件的inode没有更改),这样我将只处理delta

我希望这段代码可以帮助其他用户

#/usr/bin/perl
严格使用;
使用“全部”警告;
使用File::Path qw;
使用File::Spec;
使用文件::复制;
使用POSIXQW;
使用英语;
#动态变量
我的%u计数;
我的%older\u inode;
我的@newer_文件列表;
我的@事件;
我的$OLD_IN_FILE=“”;
#静态变量
#目录
我的$IN_DIR=“/tmp/appo/log”;#输入目录
我的$OUTPUT_LOG_目录=“/tmp/appo/A14”#输出目录
#档案
我的$SPLITTED_OUTFILE=“parse_log.csv”#按月份分割的输出文件
我的$R_统计数据=“.rotation_统计数据”#旋转统计文件
##主要
#加载旧统计数据
如果(-e$R_统计数据){
打开(STAT_文件,$R_STATS)或死亡$!;
而(){
我的@lines=split/\n/;
my($file,$inode,$nrows)=$lines[0]=~/\A(.\w.*);(\d.*);(\d.*)/;#封装值
推送{$older_count{$file},$nrows;
push@{$older_inode{$file},$inode;
}
关闭(统计文件);
}
#从日志加载新事件
foreach my$输入(glob(“$IN_DIR/logrotate.*.log”)){
my$inode=(stat$INPUT))[1];
my$currentinode=$older_inode{$INPUT}[0];
我的$jumprow=0;
$jumprow=$older_count{$INPUT}[0]如果$currentinode==$inode;
#获取当前文件统计信息
如果($INPUT ne$OLD_在_文件中){
我的$count=(split/\s+/,`wc-l$INPUT`)[0];
推送@newer_文件列表{
文件名=>$INPUT,
inode=>$inode,
count=>count美元
};
}
#原木开口
打开我的$fh,“{count}\n”;
}
关闭(统计文件);
my@by_user=sort{$a->{user}cmp$b->{user}}@events;#按用户排序
foreach my$my_列表(@by_用户){
my($y,$m)=$my\u list->{date}=~/(\d{4})\/(\d{2})/;
#生成目录YYYY月-2009年1月
my$directory=File::Spec->catfile($OUTPUT\u LOG\u directory,$m-$y);
除非(-e$目录){
mkpath($directory,{verbose=>1});
}
我的$log\u file\u path=file::Spec->catfile($directory,$SPLITTED\u OUTFILE);
打开(输出“>>”,$log\u file\u path)或骰子$!;
打印输出联接“;”,$my_list->{date},$my_list->{time},$my_list->{action},“$my_list->{user}\n”;
}
关闭(输出);
我的日志文件是

logrotate_1.0.log
#2.0^H#2018 05 29 10:09:45:969#+0200#Info#/Sys/Sec/Authentication#
#BC-JAS-SEC#security#C0000A7103EC9E5000000004#common.com/irj#com.common.services.security.authentication.logincontext.table#USER1#5#C47731E4440000BAE#0#线程[HTTP工作者[@1473726842],5,专用#应用程序#线程]###
登录
用户:USER4
IP地址:127.0.0.1
身份验证堆栈:票证
身份验证堆栈属性:
#2.0^H#2018 05 29 11:51:06:541#+0200#Info#/Sy/Sec/Authentication#
#BC-JAS-SEC#security#c000a7103ec9f50000004#common.com/irj#com.common.services.security.authentication.logincontext.table#USER4#6#A40B81404D03c0bae#0#线程[HTTP Worker[@1264376989],5,专用#u应用程序#u线程]#普通##
登录
用户:USER1
IP地址:127.0.0.1
身份验证堆栈:票证
身份验证堆栈属性:
#2.0^H#2018 05 30 11:54:03:906#+0200#信息#/Sy/Sec/Informtion#
#BC-JAS-SEC#security#c000a7103ec9f50000004#common.com/irj#com.common.services.security.authentication.logincontext.table#USER4#6#A40B81404D03c0bae#0#线程[HTTP Worker[@1264376989],5,专用#u应用程序#u线程]#普通##
登录
用户:USER4
IP地址:127.0.0.1
身份验证堆栈:票证
身份验证堆栈属性:
#2.0^H#2018 05 30 11:59:59:156#+0200#Info#/Sys/Sec/Authentication#
#BC-JAS-SEC#security#C0000A7103ECA0C#39351500000004#common.com/irj#com.common.services.security.authentication.logincontext.table#USER3#7#9ACF7Ec0bae#0#线程[HTTP Worker[@124054179],5,专用#应用程序#线程]###
注销
用户:USER3
IP地址:127.0.0.1
身份验证堆栈:票证
身份验证堆栈属性:
#2.0^H#2018 05 30 08:32:11:348#+0200#警告#/Sys/Sec/Authentication#
#BC-JAS-SEC#security#c000a7103eca20e000508c#39351500000004#common.com/irj#com.common.services.security.authentication.logincontext.table#USER2#03c0bae#0#线程[HTTP Worker[@2033389552],5,专用应用程序#线程]#普通##
登录
用户:USER4
IP地址:127.0.0.1
身份验证堆栈:票证
身份验证堆栈属性:
#2.0^H#2018 05 30 11:09:54:978#+0200#Info#/Sys/Sec/Information#
#BC-JAS-SEC#security#c000a7103eca20e000508c#39351500000004#common.com/irj#com.common.services.security.authentication.logincontext.table#USER2#03c0bae#0#线程[HTTP Worker[@2033389552],5,专用应用程序#线程]#普通##
登录
用户:USER2
IP地址:127.0.0.1
身份验证堆栈:票证
身份验证堆栈属性:
#2.0^H#2018 06 01 08:11:30:008#+0200#警告#/Sys/Sec/Authentication#
#BC-JAS-SEC#security#C0000A7103CA20050000508C#39351500000004#common.com/irj#com.common.services.security.authentication.logincontext.table#USER2#0#E0E#0#线程[HTTP Worker[@2033389552],5,专用#u应用程序#线程]###
注销
用户:USER2
IP地址:127.0.0.1
身份验证堆栈:票证
身份验证堆栈属性:
#2.0^H#2018 06 01 11:11:29:658#+0200#Info#/Sys/Sec/Information#
#BC-JAS-SEC#security#C0000A7103CA20050000508C#39351500000004#common.com/irj#com.common.services.security.authentication.logincontext.table#USER2#0#E0E#0#线程[HTTP Worker[@2033389552],5,专用#u应用程序#线程]###
注销
用户:USER1
IP地址:127.0.0.1
身份验证堆栈:票证
身份验证堆栈属性:
#2.0^H#2018 06 02 12:00:00:25
if ( $currentinode == $inode ) {
    # Get rows to jump for this $INPUT
    my $jumprow = $older_count{$INPUT}[0];
}
else {
    # If file has been changed
    my $jumprow = 0;
}
my $jumprow;
if ( $currentinode == $inode ) {
    # Get rows to jump for this $INPUT
    $jumprow = $older_count{$INPUT}[0];
}
else {
    # If file has been changed
    $jumprow = 0;
}
my $jumprow = 0;
$jumprow = $older_count{$INPUT}[0] if $currentinode == $inode;
my $jumprow = $currentinode == $inode ? $older_count{$INPUT}[0] : 0;