bash - 实时 stdout 的输出重定向在将其通过管道传输到 uniq 或 awk 后不起作用

标签 bash uniq fswatch

我在努力奔跑

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

知道为什么输出重定向不起作用吗?

最佳答案

awkuniq 将在写入常规文件时缓冲它们的输出。您可以使用 perl 获得无缓冲的行为:

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

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

关于bash - 实时 stdout 的输出重定向在将其通过管道传输到 uniq 或 awk 后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70671639/

相关文章:

linux - 测试 - linux 命令

linux - 为什么 sed 在脚本中不能正常工作

linux - 在 linux/unix 中搜索

linux - 如何在 Linux/etc/shadow 中屏蔽用户

linux - 列唯一值 linux

fswatch - 我想在 Mac 上使用 fswatch 观看多个文件夹

linux - Bash 脚本(分隔字符串)

python - 计算行出现次数并除以总行数 - unix/python

bash - fswatch 和 ffmpeg 中的输出文件扩展名

linux - Linux 上的 inotifywait 是否允许在超时期限内收集事件?