【发布时间】: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