我在 Ubuntu 桌面 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。为什么?
编辑:
问题在于输出缓冲。在下面添加了我的答案。
关闭输出缓冲就可以了。
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]"
欲了解更多信息:这个
grep
返回找到匹配项的整行,因此您遇到的行为是预期的行为。如果你确定你想要的是字符串的第五个标记,你可以使用
awk
:例如:
echo 'Black (1) : 1. e5' | grep -a "Black ([0-9][0-9]*) : [0-9][0-9]*. [a-z][0-9]" | awk '{print $5}'
仅返回e5
.