有没有办法创建awk输入非活动计时器?
我有一个文本源(一个日志文件),它由一些第三方追加新行 我可以使用有没有办法创建awk输入非活动计时器?,awk,Awk,我有一个文本源(一个日志文件),它由一些第三方追加新行 我可以使用tail-f source将添加内容输出到源文件中。然后我可以通过一个awk脚本awk-f parser.awk来解析和格式化输出 我的问题是:当tail-f source | awk-f parser.awk正在运行时,是否有方法在解析器.awk中调用函数foo(),每次超过5秒,没有任何东西通过管道进入awk脚本的标准输入 编辑:当前使用GNU Awk 3.1.6。如果需要,可以升级到新版本。这不完全是您问题的答案。不过,sh
tail-f source
将添加内容输出到源文件中。然后我可以通过一个awk脚本awk-f parser.awk
来解析和格式化输出
我的问题是:当tail-f source | awk-f parser.awk
正在运行时,是否有方法在解析器.awk
中调用函数foo()
,每次超过5秒,没有任何东西通过管道进入awk脚本的标准输入
编辑:当前使用GNU Awk 3.1.6。如果需要,可以升级到新版本。这不完全是您问题的答案。不过,shell中有一个小技巧,可以实现您想要的功能:
{ tail -f log.file >&2 | { while : ; do sleep 5; echo SECRET_PHRASE ; done ; } ; } 2>&1 | awk -f script.awk
当awk收到密码时,它将每5秒运行一次foo
功能。不幸的是,is将每5秒运行一次,即使在这段时间内有一些来自tail的输出
你可以用“()”替换“{}”,反之亦然。在第一种情况下它不会创建子shell,在第二种情况下它会创建子shell
另一种方法是将这个秘密短语直接附加到日志文件中,以防在最后五秒钟内没有人在日志文件中写入。但是看起来这不是一个好主意,因为您会破坏日志文件。如果您的shell的
读取
支持-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
{echo hello;sleep 6;echo world;}awk'BEGIN{
while(“读取时-t5-u3行;执行echo\”$line\“完成”| getline>0)
打印
}“3最好使用awk--version
的输出更新您的问题。也就是说,你不可能用awk解决这个问题。祝你好运,谢谢。试过了,它说“你好”。现在我不想在超时时停下来,只要打印,说“5秒”,然后继续。因此,预期的输出是“hello\n 5秒\n world”。因此,我尝试了BEGIN{while(1){;print“5sec”}
。但是当读取-t
第二个一角硬币时,它不会阻塞,我在一个紧密的循环中得到“5秒”的输出。你能帮我解决我错过的事情吗?我对这里的一切都不太熟悉。你可以边做边做:;读取-t5-u3行并回显“$line\”| |回显超时;完成