Linux head实用程序只读取一行需要更多输入才能退出

时间:2012-11-23 22:07:11

标签: linux bash

我需要逐行读取连续数据流(实际上是管道),我需要在第1行之后退出。在第1行之后。听起来很简单,但是,使用“head -n 1”,我注意到我确实需要在退出头之前输入第二个行。

测试用例:

[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轻量级构建块。没有Perl,Python等......)

由于

3 个答案:

答案 0 :(得分:7)

因为您使用的是cat | head -n 1 useless use of cat,与head -n 1不同。如果您在控制台上执行head -n 1,则会获得所需的行为 - head读取一行,打印并退出。

如果你cat | head -n 1,那么就会发生这种情况:

  1. cat从输入中读取“123”。
  2. cat将“123”写入其输出。
  3. head从输入中读取“123”(连接到cat的输出)。
  4. head将“123”写入其输出并退出。
  5. cat从输入中读取“456”。
  6. cat尝试将“456”写入其输出。
  7. cat获取SIGPIPE,因为其输出另一侧的进程已经死亡。
  8. cat退出。
  9. cat一旦将“123”写入head,就会开始另一次阅读,并且在尝试编写之前,它并未发现head已经死亡第二个行。

答案 1 :(得分:0)

您可以使用 control-d 关闭管道。然后刷新输出缓冲区并且head获得EOF并在它获得更多输入之前退出。

  

[s @ svr1~] $ cat | head -n 1
  123个
  123个
  控制-d
  [s @ svr1~] $

阅读第一行后

head停止。您可以使用

进行验证
  

[s @ svr1~] $ cat |头-n 1

然后执行ps aux | grep -w -e cat -e head,产生

  

...猫
  ......头   ...... grep -e cat -e head

然后输入

  

123
  123

然后再次执行ps aux | grep -w -e cat -e head,产生

  

...猫
  ...... grep -e cat -e head

瞧,头不见了。因此,当它试图写下第二行时,它不是在头上闲逛,而是在收到EPIPE后中止的猫。

答案 2 :(得分:0)

  

有人可以解释(首先)为什么会这样做?

当没有指定文件名时,

cat使用STDIN - 所以它等着你给它第二行或^ D.

你可以使用 sed -n 1p filename 仅抓住第一行或sed '1!d' filename删除除第一行以外的所有行。