我有一个文本源(一个日志文件),它会被一些第三方附加到它的新行。
我可以使用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。如果需要,可以升级到更新的版本。
答案 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之间的读取超时放在管道中可能会更有意义,并且重新实现尾部超时会更有意义。