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循环执行此操作-只是将其用作永远持续的示例。尾随文件时也会发生同样的情况。rightprintf“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
,则它不会挂起。