Linux头实用程序只读一行需要更多input才能退出

我需要从一个连续的数据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 ,那么发生这种情况:

  1. cat从输入中读取“123”。
  2. cat在输出中写入“123”。
  3. head从它的输入(连接到cat的输出)读取“123”。
  4. head写“123”到其输出并退出。
  5. cat从输入中读取“456”。
  6. cat试图写“456”到其输出。
  7. cat得到SIGPIPE因为其输出的另一端的进程已经死亡。
  8. 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