Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法创建awk输入非活动计时器?_Awk - Fatal编程技术网

有没有办法创建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\”| |回显超时;完成