我正在使用 netcat 并将输出通过管道传输到 gawk。以下是 gawk 将接收到的示例字节序列:
AAAA=AAAA;AAAA;AAAA=
由于这是一个网络流,因此读取该序列后,stdin 保持打开状态,等待未来的数据。数据可以使用
=
或 ;
作为分隔符,并且任一分隔符都可以随时出现。我希望 gawk 读取直到找到任何一个分隔符,然后使用找到的任何数据执行 gawk 脚本的主体,同时确保它正确处理标准输入的连续流。我在下面更详细地解释这部分。
这是我迄今为止尝试过的(使用 gawk 的 zsh 脚本)。对于这个问题,我简化了主体,只打印数据 - 我的完整 gawk 脚本有一个更复杂的主体。我还将 netcat 流简化为
cat
示例文件,以及 cat'ing stdin 以模仿流行为。
cat -u example.txt - | gawk 'BEGIN { RS = "=|;"; } { print $0; fflush(); }'
example.txt
AAAA=AAAA;AAAA;AAAA=
我的尝试成功处理了大部分数据......直到最新的记录。它挂起等待来自标准输入的更多数据,无法执行我的脚本主体以获取最新记录,尽管标准输入中显然有适当的分隔符。
电流输出:
AAAA
AAAA
AAAA
[hang here, waiting for future data]
期望的输出:(区别在于所有 4 条记录均已成功处理)
AAAA
AAAA
AAAA
AAAA
[hang here, waiting for future data]
经过一些调试,我确定如果标准输入关闭并且将正则表达式用于RS,则不会出现问题。相反,如果 stdin 保持打开状态并且 RS 是明文字符串,也不会出现问题。问题仅发生在标准输入保持打开并且RS是正则表达式的情况下。大概它挂起是因为它正在等待更多数据以评估正则表达式......但是标准输入上显然可以使用匹配的分隔符,所以我希望 gawk 立即处理它。这似乎是一种极端情况。 我怎样才能做到这一点?非常感谢大家的帮助!
RS
正则表达式匹配,或者输入结束。
您也没有给出它,因为您使用了cat <file> -
,这意味着
cat
的输出流在 <file>
耗尽后继续使用标准输入(您的 TTY)。您必须在空行上使用 Ctrl-D来生成必要的 EOF。