使用 RS 的正则表达式并结合从 stdin 读取连续流时,gawk 会挂起

问题描述 投票:0回答:1

我正在使用 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 立即处理它。这似乎是一种极端情况。 我怎样才能做到这一点?非常感谢大家的帮助!

regex shell awk zsh stdin
1个回答
0
投票
RS

正则表达式匹配,或者输入结束。

您也没有给出它,因为您使用了 

cat <file> -

,这意味着

cat
的输出流在
<file>
耗尽后继续使用标准输入(您的 TTY)。
您必须在空行上使用 

Ctrl-D

来生成必要的 EOF。

© www.soinside.com 2019 - 2024. All rights reserved.