实时流过滤更改日志文件

实时流过滤更改日志文件

我有file.log这个样本:

11-Feb-2022 18:34:42 lorem uneeded5
11-Feb-2022 18:34:43 water uneeded6
11-Feb-2022 18:34:44 ipsum uneeded7
11-Feb-2022 18.34.45 waterfall uneeded8

我期望filtered.log 这个样本的输出

1644579283 water
1644579285 waterfall

所以基本上我想要的过滤器是:

cut uneeded lines(我试过grep

cut uneeded column(我试过 cut

convert date string to timestamp(我试过date

别担心,我知道如何剪切和转换它。问题是,它的流并使用管道或 stdout 或 tee 等重定向输出。我对此感到困惑。

这是我所做的。

tail -f file.log | grep --line-buffered "water" | tee temp.file | cut -d' ' -f1,2 | date +%s -f- | paste -d' ' - temp.file | cut -d' ' -f1,4 >> filtered.log

为什么它不起作用?当有新行传入时file.logfiltered.log仍然空白。

从理论上来说,根据我的大脑对该命令的解释如下:

  • tail -f用于流或获取传入的新行。
  • grep --line-buffered含有水的过滤管线。
  • tee temp.file创建临时文件,以便稍后粘贴。
  • cut -f1,2获取列 1 和列 2 仅用于稍后转换为时间戳date
  • date从先前的输出转换时间戳(剪切输出)
  • paste将时间戳粘贴/合并到我之前备份的第一列 temp.file。
  • cut剪掉不需要的柱子

我怀疑这是缓冲问题,不知道如何使用缓冲区。我尝试过stdbuf但仍然不行。

答案1

解决了!

从我之前的工作来看,基本上我只需要stdbuf每个管道。我不知道为什么我们需要 stdbuf。

stdbuf -oL tail -f file.log | grep --line-buffered "water" | tee temp.file | stdbuf -oL -i0 cut -d' ' -f1,2 | stdbuf -oL -i0 date +%s -f- | stdbuf -oL -i0 paste -d' ' - temp.file | stdbuf -oL -i0 cut -d' ' -f1,4 >> filtered.log

相关内容