定期过滤更改文件并将过滤后的输出重定向到新文件

定期过滤更改文件并将过滤后的输出重定向到新文件

假设我有log.txt

log.txt的样本格式如下: Code Data Timestamp

...
C:57 hello 1644498429
C:56 world 1644498430
C:57 water 1644498433
...

如果我想要过滤包含的字符串行,C:57我可以通过以下方式实现

cat log.txt | grep C:57

然后我将输出重定向到新文件

cat log.txt | grep C:57 > filtered_log.txt

然而,当 log.txt 中有新的更改时,我应该再次重复执行该命令。我希望它定期执行,或者针对文件中的每个新更改执行,或者仅在存在包含 string 的新行时执行C:57

答案1

您可以tail -f这样使用:

tail -f log.txt|grep C:57 >> filtered_log.txt

这会连续读取log.txt标记的 grepC:57并将任何匹配项添加到filtered.log.txt.

使用 来cat读取日志并通过管道传输到grep是无用的catgrep可以直接读取文件。通过组合 acat和 a会浪费 I/O grep

这里的一个缺点是过滤输出的出现可能会由于缓冲而延迟。这可以通过以下方式规避:

tail -f log.txt|grep --line-buffered C:57 >> filtered_log.txt

或使用以下stdbuf -o0命令:

 tail -f log.txt|stdbuf -o0|grep C:57 >> filtered_log.txt C:57

相关内容