【问题标题】:Awk, pipe and tail -f giving unexpected behavior [duplicate]awk,pipe 和 tail -f 给出意外行为[重复]
【发布时间】:2015-10-31 05:01:28
【问题描述】:

这是我的示例日志文件。http://pastebin.com/DwWeFhJk

当我在做的时候

tail -f log | awk '{if (NF>3) {print $1}; }'

我得到的结果是正确的

64.242.88.10
64.242.88.10
64.242.88.10
64.242.88.10
64.242.88.10
64.242.88.10
64.242.88.10
64.242.88.10
64.242.88.10
64.242.88.10

但是当我在做的时候:

tail -f log |
awk '{if (NF>3) {print $1}; }' |
awk '{print $1}'

我没有得到任何输出。即使在

的情况下也没有输出
tail -f log | awk '{if (NF>3) {print $1}; }' | grep "64"

我不明白为什么第一个awk 的输出没有作为第二个awk/grep 在管道之后的输入传递。

【问题讨论】:

  • 命令 tail -f log | awk '{if (NF>3) {print $1}; }' | grep "64" 给我的输出与上面显示的相同。你确定它没有给你输出吗?如果不是,您使用的是什么操作系统?
  • 我不认为这取决于操作系统。无论如何,我正在使用拱门。
  • 当操作系统是 solaris 时,awk 问题通常取决于操作系统。相比之下,拱门应该没问题。既然您提到问题发生在tail -f 而不是tail,我相信乔纳森已经确定了最可能的问题。

标签: linux bash awk pipe tail


【解决方案1】:

当第一个awk 的输出到终端时,输出是行缓冲的,所以每一行在生成时都会被打印出来。当输出到第二个awkgrep 时,它是完全缓冲的。在缓冲区已满之前不会发送输出。当足够多的额外记录附加到日志时,第二个awk 将在缓冲区中填满要处理的数据。在那之前,什么都不会发生。

【讨论】:

  • 那么,stbuf -oL 会在这里帮忙吗?
  • 如果你的意思是stdbuf -oL awk …,那么可能。
  • 如何在awk的情况下得到想要的结果。还有为什么仅在 tail -f 之后没有发生行缓冲的事情。我的意思是 tail -f 的输出也应该得到行缓冲,即使在 tail -f log | 的情况下也不应该看到任何输出。 awk '{如果 (NF>3) {打印 $1}; }
  • @HarshSharma:您可以查找@John1024 提到的stdbuf 命令,我已经为此提供了文档链接。至于tail -f,它可能显式设置行缓冲,而awk 没有。至少,这是一个合理的猜测。 tail -f 永远不会产生 EOF(嗯,直到有人或某物用中断或其他信号杀死它)。
  • 一个命令在检测到它的输入或输出被发送到一个 tty 时应该使用交互式行缓冲。如果输入和输出都连接到管道,则该命令可能会选择进行完全缓冲。这就是为什么存在交互式选项(在某些 awk 版本中)的原因(请查看我的答案)。
【解决方案2】:

您以tail -f 开始命令,这会使输出保持打开状态,因此不会向其他命令发送所需的换行符。

这很好用:

cat log | awk '{if (NF>3) {print $1}; }' | grep 64

所以,问题在于缓冲。中间的 awk 是做普通缓冲而不是交互式缓冲。这适用于 mawk(不可移植):

tail -f log | mawk -W interactive '{if (NF>3) {print $1}; }' | awk '{print}'

您可以阅读GNU description of the issue

在任何情况下,只需检查中间使用的 awk 是否可以被告知以交互方式缓冲。

补充:

命令 system("") 似乎解除了缓冲。它是 POSIX,但不适用于 mawk。

tail -f log | awk '{if (NF>3) {print $1}; system("")}' | awk '{print}'

【讨论】:

  • 系统不工作
【解决方案3】:

在链接中搜索“parallel --pipe”以避免缓冲

https://www.gnu.org/software/parallel/parallel_tutorial.html

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多