有没有办法创建一个awk输入不活动计时器?

时间:2012-07-25 13:54:47

标签: awk

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

我可以使用tail -f source将添加内容输出到我的源文件。然后我可以通过awk脚本awk -f parser.awk来管道它来解析和格式化输出。

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

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

2 个答案:

答案 0 :(得分:1)

不完全是你问题的答案。然而,shell中有一点可以实现你想要的东西:

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

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

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

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

答案 1 :(得分:1)

如果你的shell read支持-t-u,那么这是一个丑陋的黑客攻击:

{ 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

您可以使用脚本替换while循环体中的print。但是,将尾部和awk之间的读取超时放在管道中可能会更有意义,并且重新实现尾部超时会更有意义。