我在努力奔跑
fswatch -tr /home/*/*/public_html | grep --line-buffered -E ".php|.xml" | awk '!seen[$0]++' >> log.txt
或等效地(通过使用 uniq
):
stdbuf -i0 -o0 -e0 fswatch -tr /home/*/*/public_html | grep --line-buffered -E ".php|.xml" | uniq >> log.txt
这样我就不会得到重复的行。它在终端中工作得很好,有标准输出,但是当我试图将该输出写入 log.txt
时,文件是空白的(或者如果使用 则没有插入新行>>
).
fswatch
是一个实时“监控”文件系统更改的命令,它会生成大量重复事件,而 uniq
似乎可以很好地解决这个问题。
知道为什么输出重定向不起作用吗?
最佳答案
awk
和 uniq
将在写入常规文件时缓冲它们的输出。您可以使用 perl
获得无缓冲的行为:
... | perl -ne '$|=1; print unless ${$_}++'
这是 perl
等同于 awk '!seen[$0]++'
,但是设置 $|
非零会使输出无缓冲。为了更正确,您可能应该编写 BEGIN{$|=1}
这样您就不会在每一行输入上都进行分配,但这并不是真正必要的。
关于bash - 实时 stdout 的输出重定向在将其通过管道传输到 uniq 或 awk 后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70671639/