将 grep 管道传输到另一个 grep 无法按预期工作

将 grep 管道传输到另一个 grep 无法按预期工作

我在 Ubuntu Desktop 20.04 上使用 grep。

我想通过每回合使用 grep 获取 gnuchess 游戏中玩家的动作。我使用的第一个命令是:

gnuchess -mq | grep -a "Black ([0-9][0-9]*) : [0-9][0-9]*. [a-z][0-9]" | grep "[a-z][0-9]"

对于第一个 grep,如果动作是“e3”和“e5”,则输出为:

黑棋 (1) : 1. e5

我希望第二个 grep 能给我e5但事实并非如此。输出为空白。

然而,当我将 gnuchess 输出重定向到一个文件并使用相同的命令时,它可以工作并显示e5。 为什么?

编辑

问题在于输出缓冲。在下面添加了我的答案。

答案1

关闭输出缓冲就可以了。

gnuchess -mq | stdbuf -o0 grep -a "Black ([0-9][0-9]*) : [0-9][0-9]*. [a-z][0-9]" | grep -o "[a-z][0-9]"

了解更多信息:

答案2

grep返回找到匹配项的整行,因此您遇到的行为是预期的行为。

如果您确定想要的是字符串的第五个标记,则可以使用awk

gnuchess -mq | grep -a "Black ([0-9][0-9]*) : [0-9][0-9]*. [a-z][0-9]" | awk '{print $5}'

例如:echo 'Black (1) : 1. e5' | grep -a "Black ([0-9][0-9]*) : [0-9][0-9]*. [a-z][0-9]" | awk '{print $5}'仅返回e5

相关内容