Perl 从中调整日志时间

Perl 从中调整日志时间,perl,awk,Perl,Awk,这个日志是用格林威治标准时间记录的,所以我每天早上从中减去5个小时,就可以把它转到东部时间,然后进行我的检查 这是原始数据: casper@casperbox:~$ tail /data/rafterman.log 115510.1 INFO log opened for 2014/12/01 115510.1 INFO successfully locked 115510.2 INFO starting 115510.2 INFO successfully set child death si

这个日志是用格林威治标准时间记录的,所以我每天早上从中减去5个小时,就可以把它转到东部时间,然后进行我的检查

这是原始数据:

casper@casperbox:~$ tail /data/rafterman.log
115510.1 INFO log opened for 2014/12/01
115510.1 INFO successfully locked
115510.2 INFO starting
115510.2 INFO successfully set child death signal:
115510.2 INFO Env: 'PATH=/bin:/usr/bin'
115510.2 INFO Env: 'LD_LIBRARY_PATH='/
115510.2 INFO <- SYSSTATS
casper@casperbox:~$ tail /data/rafterman.log
我怎样才能得到一个06:55的直线上升-在小时和分钟之间放置冒号的简单方法是什么?perl或awk一行程序

casper@casperbox:~$ tail /data/rafterman.log | awk '{ $1 = $1 -50000; print } '
65510.1 INFO log opened for 2014/12/01  
65510.1 INFO successfully locked
65510.2 INFO starting
65510.2 INFO successfully set child death signal:
65510.2 INFO Env: 'PATH=/bin:/usr/bin'
65510.2 INFO Env: 'LD_LIBRARY_PATH='/
65510.2 INFO <- SYSSTATS
casper@casperbox:~$ tail /data/rafterman.log | awk '{ $1 = $1 -50000; print } '
casper@casperbox:~$tail/data/rafterman.log | awk'{$1=$1-50000;print}'
65510.1 2014/12/01信息日志打开
65510.1信息已成功锁定
65510.2信息启动
65510.2信息成功设置儿童死亡信号:
65510.2信息环境:“路径=/bin:/usr/bin”
65510.2信息环境:“LD_LIBRARY_PATH=”/
65510.2信息

$ cat input
65510.1 INFO log opened for 2014/12/01  
65510.1 INFO successfully locked
65510.2 INFO starting
65510.2 INFO successfully set child death signal:
65510.2 INFO Env: 'PATH=/bin:/usr/bin'
65510.2 INFO Env: 'LD_LIBRARY_PATH='/
65510.2 INFO <- SYSSTATS

$ awk  '{sub("[0-9]{2}.[0-9]$", "", $1); sub("[0-9]{2}$", ":&",$1)}1' input
6:55 INFO log opened for 2014/12/01
6:55 INFO successfully locked
6:55 INFO starting
6:55 INFO successfully set child death signal:
6:55 INFO Env: 'PATH=/bin:/usr/bin'
6:55 INFO Env: 'LD_LIBRARY_PATH='/
6:55 INFO <- SYSSTATS
$cat输入
65510.1 2014/12/01信息日志打开
65510.1信息已成功锁定
65510.2信息启动
65510.2信息成功设置儿童死亡信号:
65510.2信息环境:“路径=/bin:/usr/bin”
65510.2信息环境:“LD_LIBRARY_PATH=”/
65510.2信息
在多伦多,它输出

06:55.1 INFO log opened for 2014/12/01
06:55.1 INFO successfully locked
06:55.2 INFO starting
06:55.2 INFO successfully set child death signal:
06:55.2 INFO Env: 'PATH=/bin:/usr/bin'
06:55.2 INFO Env: 'LD_LIBRARY_PATH='/
06:55.2 INFO <- SYSSTATS
03:55.1 INFO log opened for 2014/12/01
03:55.1 INFO successfully locked
03:55.2 INFO starting
03:55.2 INFO successfully set child death signal:
03:55.2 INFO Env: 'PATH=/bin:/usr/bin'
03:55.2 INFO Env: 'LD_LIBRARY_PATH='/
03:55.2 INFO <- SYSSTATS
06:55.1 2014/12/01信息日志打开
06:55.1信息已成功锁定
06:55.2信息开始
06:55.2信息成功设置儿童死亡信号:
06:55.2信息环境:“路径=/bin:/usr/bin”
06:55.2信息环境:“LD_LIBRARY_PATH=”/

06:55.2信息这是您要求的:

$ awk '{$1=sprintf("%02d:%02d",substr($1,1,2)-5,substr($1,3,2))}1' file
06:55 INFO log opened for 2014/12/01
06:55 INFO successfully locked
06:55 INFO starting
06:55 INFO successfully set child death signal:
06:55 INFO Env: 'PATH=/bin:/usr/bin'
06:55 INFO Env: 'LD_LIBRARY_PATH='/
06:55 INFO <- SYSSTATS

$awk-f tst.awk文件
06:55 2014/12/01信息日志打开
06:55信息已成功锁定
06:55信息开始
06:55信息成功设置儿童死亡信号:
06:55信息环境:“路径=/bin:/usr/bin”
06:55信息环境:“LD_LIBRARY_PATH=”/

06:55信息我是A队的T先生。 与其像傻瓜一样使用一行程序,为什么不将文件导入perl脚本中呢

#!/usr/bin/perl
while (<>) {
    if ($_=~ /(^\d+\.\d+)Z/)    {
    my $new_time = $1 - 50000  ;
    my ($new_hour, $null) = split(/\./, $new_time);
    s/$1/$new_hour/g ;
    print $_ ;
    } 
}
#/usr/bin/perl
而(){
如果($\=~/(^\d+\.\d+.+Z/){
我的$new_时间=$1-50000;
my($new\u hour,$null)=拆分(/\./,$new\u time);
s/$1/$new_小时/g;
打印美元;
} 
}

您的实际源数据和预期输出是什么?如果原始时间是035510.2-您需要将日期回归一天减去5小时吗?我没有想到Ed-这就是为什么您可能赚大钱的原因-是的,可能,现在我只是检查早上6点发射的东西。现在是24小时。我想
.1
.2
等都是分数秒,所以
115510.1
11:55:10.1
我错过了。但是你不认为分析应该在决议之前进行吗?是的,更好。但是你误解了我。我认为这种分析(在本例中,是您对变量的假设和注释)应该在任何解决方案(这里是您的代码)之前进行。更一般地说,插入的评注应在插入之前。它遵循口语和文学实践。例如,最好在剧本开始前说“俄狄浦斯被认为已经丧失了王位”,而不是afterwards@Borodin,脚注属于页脚。我不认为一个微小的细节会影响答案。在这方面我们有分歧。我认为您对我认为最有可能是小数秒的内容的处理是一个主要细节,您应该在公开Perl代码之前描述它的行为。我认为进一步争论没有什么好处;只有OP可能知道他们发布的数据的语义。哇-。T先生不知道您编写了脚本,至少会认为您使用了python。我试试看,谢谢。
03:55.1 INFO log opened for 2014/12/01
03:55.1 INFO successfully locked
03:55.2 INFO starting
03:55.2 INFO successfully set child death signal:
03:55.2 INFO Env: 'PATH=/bin:/usr/bin'
03:55.2 INFO Env: 'LD_LIBRARY_PATH='/
03:55.2 INFO <- SYSSTATS
$ awk '{$1=sprintf("%02d:%02d",substr($1,1,2)-5,substr($1,3,2))}1' file
06:55 INFO log opened for 2014/12/01
06:55 INFO successfully locked
06:55 INFO starting
06:55 INFO successfully set child death signal:
06:55 INFO Env: 'PATH=/bin:/usr/bin'
06:55 INFO Env: 'LD_LIBRARY_PATH='/
06:55 INFO <- SYSSTATS
$ cat tst.awk
/log opened/ { oldDate = gensub("/"," ","g",$NF) }
{
    oldTime = gensub(/(..?)(..)(..)\..*/,"\\1 \\2 \\3","",$1)
    oldSecs = mktime(oldDate " " oldTime)
    newSecs = oldSecs - (5 * 60 * 60)
    newDate = strftime("%Y/%m/%d",newSecs)
    newTime = strftime("%H:%M",newSecs)
}
/log opened/ { $NF = newDate }
{ $1 = newTime; print }
$ awk -f tst.awk file
06:55 INFO log opened for 2014/12/01
06:55 INFO successfully locked
06:55 INFO starting
06:55 INFO successfully set child death signal:
06:55 INFO Env: 'PATH=/bin:/usr/bin'
06:55 INFO Env: 'LD_LIBRARY_PATH='/
06:55 INFO <- SYSSTATS
#!/usr/bin/perl
while (<>) {
    if ($_=~ /(^\d+\.\d+)Z/)    {
    my $new_time = $1 - 50000  ;
    my ($new_hour, $null) = split(/\./, $new_time);
    s/$1/$new_hour/g ;
    print $_ ;
    } 
}