管道中间的 AWK 不返回输出

管道中间的 AWK 不返回输出

我想处理来自 apache 的所有更改的日志文件并制作一个简单的 oneliner:

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }'

这正是我的开始。但是如果我进一步通过管道输出,我就不会得到任何输出:

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | wc -l

无论如何,如果我使用“ls”、“tail”(我真正想要的),则永远不会有输出(在另一个控制台中,运行第一个语句,我知道,有变化)。我尝试添加 stdbuf、fflush(),但没有任何效果。我不明白这个问题!我想将这个在线用户保存到一个脚本中,我可以将其用作字符串点。否则,我可以(但不希望)使用 xargs。任何帮助或提示都会很好!

答案1

您没有获得输出的原因是wc -l消耗了所有输出。您可以tee与进程替换结合使用,将awk输出输出到控制台并通过以下方式读取wc

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | tee >(wc -l)

这仍然存在一些问题,因为inotifywait命令永远不会退出,但wc -l在读取所有数据(在本例中是当管道关闭时)之前不会打印输出。您可以直接在以下位置进行计数awk

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk 'BEGIN { total=0 } { print; total++; print total } END { print "final total: " total }'

相关内容