我需要从一个连续的数据stream(pipe道,实际上)逐行阅读,我需要在第一行之后退出。 第一行之后右。 听起来相当容易,但是,使用“head -n 1”,我注意到我实际上需要在退出之前input第二行。
testing用例:
[s@svr1 ~]$ cat | head -n 1 123 <- I type this first (followed by enter, of course) 123 <- I get this output from head, but the command does no exit 456 <- Then I need to type this for the command to exit and bring me back to the prompt [s@svr1 ~]$
有人可以解释(首先)为什么这样做,也许我怎么能得到我所需要的? (我想坚持基本的Linux / Unix轻量级构build模块,没有Perl,Python等等)
谢谢
因为你正在使用cat | head -n 1
cat | head -n 1
,这是一个无用的猫使用,不一样的head -n 1
。 如果在控制台上执行head -n 1
,则会得到所需的行为 – 读取一行,打印并退出。
如果你做cat | head -n 1
cat | head -n 1
,那么发生这种情况:
cat
从输入中读取“123”。 cat
在输出中写入“123”。 head
从它的输入(连接到cat
的输出)读取“123”。 head
写“123”到其输出并退出。 cat
从输入中读取“456”。 cat
试图写“456”到其输出。 cat
得到SIGPIPE
因为其输出的另一端的进程已经死亡。 cat
退出。 cat
一旦写入“123”就开始另一次读取,并且不会发现head
已经死亡,直到它尝试写入第二行为止。
您可以使用control-d关闭管道。 然后输出缓冲区被刷新,并且头获得一个EOF并在获得更多输入之前退出。
[s @ svr1〜] $ cat | 头-n 1
123
123
控制-d
[s @ svr1〜] $
head
读完第一行后停下来。 你可以用它来验证
[s @ svr1〜] $ cat | 头-n 1
然后做一个ps aux | grep -w -e cat -e head
ps aux | grep -w -e cat -e head
,这就产生了
… 猫
头
grep -e猫-e头
然后输入
123
123
然后做一个ps aux | grep -w -e cat -e head
ps aux | grep -w -e cat -e head
,这是收益率
… 猫
grep -e猫-e头
等瞧,头就走了。 所以它不是在四处张望,而是在收到EPIPE后中止的猫,当它试图写第二行时。
有人可以解释(首先)为什么它是这样的?
当没有指定文件名时, cat
使用STDIN
– 所以它等着你给它第二行或^ D。
您可以使用sed -n 1p filename
只抓取第一行或sed '1!d' filename
来删除第一行以外的所有sed '1!d' filename
。