1

我有一个文本源(一个日志文件),它得到一些第三方附加的新行。

我可以使用tail -f source. 然后,我可以通过 awk 脚本awk -f parser.awk对其进行管道解析和格式化输出。

我的问题是:在tail -f source | awk -f parser.awk运行时,有没有办法function foo()在我的parser.awk脚本中调用,每次超过 5 秒,而没有任何东西通过管道进入 awk 脚本的标准输入?

编辑:目前使用 GNU Awk 3.1.6。如果需要,可以升级到较新的版本。

4

2 回答 2

1

如果你的 shellread支持-tand -u,这里有一个丑陋的 hack:

{ echo hello; sleep 6; echo world; } | awk 'BEGIN{ 
    while( "while read -t 5 -u 3 line; do echo \"$line\"; done" | getline > 0 )
        print
    }' 3<&0

您可以将printwhile 循环主体中的 替换为您的脚本。但是,将读取超时放在 tail 和 awk 之间可能更有意义,并且重新实现 tail 到超时会更有意义。

于 2012-07-25T14:53:07.980 回答
1

不完全是您问题的答案。然而,shell 中有一个小技巧,几乎可以做你想做的事:

{ tail -f log.file >&2 |  { while : ; do sleep 5; echo SECRET_PHRASE ; done ; } ; } 2>&1 | awk -f script.awk

当 awk 收到 SECRET_PHRASE 时,它将foo每 5 秒运行一次函数。不幸的是,即使在这段时间内尾部有一些输出,它也会每 5 秒运行一次。

附言。您可以将 '{}' 替换为 '()',反之亦然。在第一种情况下它不会创建子外壳,在第二种情况下它会。

另一种方法是将这个秘密短语直接附加到日志文件中,以防在最后五秒钟内没有人在那里写信。但看起来这不是一个好主意,因为你会损坏日志文件。

于 2012-07-25T14:33:26.413 回答