我需要逐行读取连续数据流(实际上是管道),我需要在第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等......)
由于
答案 0 :(得分:7)
因为您使用的是cat | head -n 1
useless use of cat,与head -n 1
不同。如果您在控制台上执行head -n 1
,则会获得所需的行为 - head
读取一行,打印并退出。
如果你cat | head -n 1
,那么就会发生这种情况:
cat
从输入中读取“123”。cat
将“123”写入其输出。head
从输入中读取“123”(连接到cat
的输出)。head
将“123”写入其输出并退出。cat
从输入中读取“456”。cat
尝试将“456”写入其输出。cat
获取SIGPIPE
,因为其输出另一侧的进程已经死亡。cat
退出。 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
,产生
瞧,头不见了。因此,当它试图写下第二行时,它不是在头上闲逛,而是在收到EPIPE后中止的猫。...猫
...... grep -e cat -e head
答案 2 :(得分:0)
当没有指定文件名时,有人可以解释(首先)为什么会这样做?
cat
使用STDIN
- 所以它等着你给它第二行或^ D.
你可以使用
sed -n 1p filename
仅抓住第一行或sed '1!d' filename
删除除第一行以外的所有行。