我有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.log
,filtered.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