假设我有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
是无用的cat
。grep
可以直接读取文件。通过组合 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