3

我正在尝试运行

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似乎可以很好地解决这个问题。

任何想法为什么输出重定向不起作用?

4

2 回答 2

2

awkuniq在写入常规文件时缓冲它们的输出。您可以通过以下方式获得无缓冲的行为perl

... | perl -ne '$|=1; print unless ${$_}++'

perl相当于awk '!seen[$0]++',但设置$|非零会使输出无缓冲。为了更正确,您可能应该这样写BEGIN{$|=1},这样您就不会对每一行输入进行分配,但这并不是真正必要的。

于 2022-01-11T21:41:46.993 回答
0

格式在评论中看起来不正确,所以为了清楚起见,只需重新粘贴它:

mawk '!__[$_]--{ print; fflush() }'
于 2022-01-12T05:03:10.487 回答