【问题标题】:awk update timestamp on duplicate dataawk 更新重复数据的时间戳
【发布时间】:2014-06-11 10:03:40
【问题描述】:

给定如下命令行,

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 文件,并且仅当 $2 大于 100 并且 $1 在文件中不存在时才实时输出 $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

谢谢

【问题讨论】:

  • $0 在 shell 级别和 $0 在 awk 级别是两个非常不同的东西。另外,当新的重复行出现时,您是否希望 awk 重写输出文件中的现有行?因为你不能以流媒体方式做到这一点。
  • 是的,当他们进来时覆盖。如果需要,我愿意以其他方式做。每分钟运行一个帖子脚本或其他东西
  • 我已经重读了很多遍,但无法弄清楚你想要做什么。你为什么打电话给system("")s 是什么意思?您在how do I combine the two commands? 中指的是哪两个命令?你希望awk -v s=$0 '/^$1/... 会做什么?请更新您的问题以使其更清晰,包括正确格式化示例输入和输出以及删除冗余/不必要的信息。
  • 前 2 个命令。调用 system("") 来刷新缓冲区。我可以使用 flush("") 但 system("") 似乎可以工作
  • 第二条命令中的s是一个数字,后跟时间戳

标签: linux bash awk centos tail


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2017-05-12
    • 2016-02-24
    • 2023-04-02
    相关资源
    最近更新 更多