Bash 在osx上使用head-n1获得grep的第一个匹配

Bash 在osx上使用head-n1获得grep的第一个匹配,bash,macos,grep,head,Bash,Macos,Grep,Head,我正在尝试使用head-n1来获得第一个grep匹配(建议在一些地方使用) 我希望这能奏效 $ printf "x=0;\nwhile True:\n x+=1\n print x" | python | grep -w 333 | head -n1 (将永远持续的内容导入grep命令,该命令将选择一行,然后从该输出中获取第一行) 然而,没有输出,它也不会停止 这就像预期的一样:(取无限输出的第一行,不带grep) (而且从不退出) 然而,这种组合并没有给我我所期望的: $ printf "x

我正在尝试使用
head-n1
来获得第一个grep匹配(建议在一些地方使用)

我希望这能奏效

$ printf "x=0;\nwhile True:\n x+=1\n print x" | python | grep -w 333 | head -n1
(将永远持续的内容导入grep命令,该命令将选择一行,然后从该输出中获取第一行)

然而,没有输出,它也不会停止

这就像预期的一样:(取无限输出的第一行,不带grep)

(而且从不退出)

然而,这种组合并没有给我我所期望的:

$ printf "x=0;\nwhile True:\n x+=1\n print x" | python | grep -w 333 | head -n1
(从不打印任何内容,也从不退出)

您需要在
grep
中使用
--line buffered
选项:

printf "x=0;\nwhile True:\n x+=1\n print x" | python | grep --line-buffered -w 333 | head -n 1
333
--line-buffered
     Force output to be line buffered.  By default, output is line buffered when standard
     output is a terminal and block buffered otherwise.
根据man grep:

printf "x=0;\nwhile True:\n x+=1\n print x" | python | grep --line-buffered -w 333 | head -n 1
333
--line-buffered
     Force output to be line buffered.  By default, output is line buffered when standard
     output is a terminal and block buffered otherwise.
但是请注意,由于您在python代码中运行无限循环,所以该命令不会退出

如果要在打印第一个匹配项后立即退出管道,请使用
awk

printf "x=0;\nwhile True:\n x+=1\n print x" | python |& awk '$1=="333"/{print; exit}'
333
支持
-m
选项:

-m num,--max count=num
num匹配后停止读取文件。
因此,您可以跳过标题并使用
-m1

$printf“x=0;\n为真:\n x+=1\n print x”| python | grep-w 333-m1
333
回溯(最近一次呼叫最后一次):
文件“”,第4行,在

作为旁白,您可以使用
python-c$'x=0将带有文字换行符的字符串作为参数传递(而不是stdin)\nwhile True:\n x+=1\n print x'
我很好奇-为什么要使用shell打印一个循环,通过管道传递给python执行,而不是只在shell中编写循环:
x=0;while:;do echo$((x+=1));完成| grep…
?抱歉-我并不是在用python循环执行此操作-只是将其用作永远持续的示例。尾随文件时也会发生同样的情况。right
printf“x=0;\n而True:\n x+=1\n print x”| python | grep 333--line buffered | head-n1
打印结果,但仍不会如您所说的那样退出。我仍然不明白为什么会退出,因为
printf“x=0;\n而这是真的:\n x+=1\n print x“| python | head-n1
仍然存在无限循环。
head-n1
退出,因为它已经打印了给定数量的行,即
1
行。但是
grep
没有退出,因为我们没有告诉
grep
在第一场比赛后退出。这可以使用
awk
grep-m1
来完成,那么为什么
printf“x=0;\n虽然是真的:\nx+=1\nprint x“| python | grep333 | head-n1
退出?这是因为
grep
的缓冲行为。如果使用
printf“x=0;\n而为True:\n x+=1\n print x”| python | awk'/333/'| head-n 1
,则它不会挂起。