我在 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
。