awk更新重复数据的时间戳

时间:2014-04-25 15:35:45

标签: linux bash awk centos tail

给定命令行如下,

tail -f /var/log/somelog.log | awk '$2>100 {if (!($1 in a)) print $1, strftime ("%Y-%m-%d %H:%M:%S"); a[$1]=1; system("")}' > /var/log/filtered.log

此命令采用somelog.log文件,实时输出$ 1,如果$ 2大于100且文件中尚不存在$ 1并添加时间戳。

我希望它做的是,每当重复数据进入时更新时间戳。

手动运行这样的命令会产生所需的结果

awk -v s="output from above command here" '/^"first field from above command"/{f=1;$0=s}7;END{if(!f)print s}' /var/log/filtered.log

例如,输入s = 111111 04-25-2014 01:00:00和^ 111111会将“111111 04-25-2014 01:00:00”添加到文件中,因为它不存在。

输入s = 111111 04-25-2014 02:00:00和^ 111111导致“111111 04-25-2014 01:00:00”被111111 04-25-2014 02:00:00覆盖了是期望的结果

但是.. 我如何组合这两个命令?我已经尝试过以下测试无效

tail -f /something.log | awk -v s=$0 '/^$1/{f=1;$0=s}7;END{if(!f)print s}'

编辑:澄清

给定以下输入,滚动到日志文件[不在文件中]。

1111111 3490349 daaaaaaaaaaaaaaaaaaaattttttttttttaaaaaaaaaaaaaaaaa [added 01:00:00am]
2103322 424 daaaaaaaaaaaaaaaaaaaattttttttttttaaaaaaaaaaaaaaaaa [added 02:00:00am]
1323233 233444 daaaaaaaaaaaaaaaaaaaattttttttttttaaaaaaaaaaaaaaaaa [added 03:00:00am]
1111111 2212223 daaaaaaaaaaaaaaaaaaaattttttttttttaaaaaaaaaaaaaaaaa [added 04:00:00am]

如果列b>我想要在输出文件中100000,数字,最新时间戳

1323233 04-24-2014 03:00:00
1111111 04-24-2014 04:00:00

由于

1 个答案:

答案 0 :(得分:1)

您没有在输出中显示日期的来源,因为它在您的输入中不存在,所以我忽略了这一点,但这应该让您非常接近您的需求:

$ cat file
1111111 3490349 daaaaaaaaaaaaaaaaaaaattttttttttttaaaaaaaaaaaaaaaaa [added 01:00:00am]
2103322 424 daaaaaaaaaaaaaaaaaaaattttttttttttaaaaaaaaaaaaaaaaa [added 02:00:00am]
1323233 233444 daaaaaaaaaaaaaaaaaaaattttttttttttaaaaaaaaaaaaaaaaa [added 03:00:00am]
1111111 2212223 daaaaaaaaaaaaaaaaaaaattttttttttttaaaaaaaaaaaaaaaaa [added 04:00:00am]

$ awk '
$2>100000 {
    keys[$1]
    sub(/.m\]/,"")
    time[$1]=$NF
}
END {
    for (key in keys)
        print key, time[key]
}
' file
1111111 04:00:00
1323233 03:00:00
相关问题